이후 std::list
및 std::vector
존재처럼, C ++ 전통적인 C 배열을 사용하는 이유가있다, 또는 그들은 피해야한다 malloc
?
답변:
std::array
사용 가능한 C ++ 11에서 대답은 "예, 배열은 피해야합니다"입니다. C ++ 11 이전에는 자동 저장소 (예 : 스택)에 배열을 할당하기 위해 C 배열을 사용해야 할 수 있습니다.
확실히, std::array
C ++ 11에서는 실제로 정적 데이터에만 해당됩니다. C 스타일 배열에는 다음과 같은 세 가지 중요한 이점이 있습니다
std::vector
.
동적 할당이 필요하지 않습니다. 이러한 이유로 C 스타일 배열은 매우 작은 배열이 많을 가능성이 높은 곳에서 선호됩니다. n 차원 점과 같이 말하십시오.
template <typename T, int dims>
class Point
{
T myData[dims];
// ...
};
일반적으로 dims
매우 작은 (2 또는 3),
T
내장 유형 ( double
), 그리고 std::vector<Point>
수백만 개의 요소로 끝날 수 있다고 상상할 수 있습니다
. 3 배의 수백만 개의 동적 할당을 원하지는 않습니다.
지원 정적 초기화입니다. 이것은 다음과 같은 정적 데이터의 문제 일뿐입니다.
struct Data { int i; char const* s; };
Data const ourData[] =
{
{ 1, "one" },
{ 2, "two" },
// ...
};
이것은 모든 순서의 초기화 문제를 std::string
방지 하기 때문에 벡터 (및 ) 를 사용하는 것보다 선호되는 경우가 많습니다 . 실제 코드가 실행되기 전에 데이터가 미리로드됩니다.
마지막으로 위와 관련하여 컴파일러는 이니셜 라이저에서 배열의 실제 크기를 계산할 수 있습니다. 셀 필요가 없습니다.
C ++ 11에 액세스 할 수있는 경우 std::array
처음 두 문제를 해결하고 첫 번째 경우에는 C 스타일 배열보다 확실히 사용해야합니다. 그러나 세 번째 문제는 다루지 않으며 이니셜 라이저 수에 따라 컴파일러 차원에서 배열을 지정하는 것이 C 스타일 배열을 선호하는 유효한 이유입니다.
int i[] = { 1, 2, 3 };
에서 계속 작업합니다 int i[] = { 1, 2, 3, 4 };
. array<int, 3>
수동으로으로 변경해야 array<int, 4>
합니다.
std::array
C ++ 11에서는 [그들은 정적 데이터에만 사용되어야 하지만]"라고 대답했습니다 .
동적 메모리 할당을 사용할 수없는 안전이 중요한 시스템에서 작업했습니다. 메모리는 항상 스택에 있어야합니다. 따라서이 경우 컴파일 타임에 크기가 고정되므로 배열을 사용합니다.
std::array<T>
스택에 할당하고 기본적으로 원시 배열에 오버 헤드가 없습니다.
array
in c++
은 동적 크기 std::vector
및 std::list
. std :: array 는 c++11
. 표준 컨테이너의 이점을 제공하는 동시에 C 스타일 배열의 집계 유형 의미를 제공합니다.
그래서 c++11
나는 확실히 std::array
필요한 곳에서 벡터를 사용합니다. 하지만 나는 C++03
.
대부분의 경우, 아니요 , 원시 배열을 사용하는 이유를 생각할 수 없습니다 vectors
. 코드가 새 .
라이브러리가 배열 및 원시 포인터를 예상하는 코드와 호환되어야하는 경우 배열을 사용해야 할 수 있습니다.
vector.data()
C ++ 11 또는 &vector.front()
이전 버전.
적은 양의 정적 데이터를 저장하는 경우 배열이 여전히 유용하다고 말하고 싶습니다.
std::vector
내가 생각할 수있는 것 보다 배열의 유일한 장점은 (물론 필요할 때 자동으로 할당 해제를 관리하는 것으로 래핑 된) vector
컴파일러가 C ++ 11 및 이동 생성자를 지원하지 않는 한 데이터의 소유권을 전달할 수 없다는 것입니다.
swap
.
C 스타일 배열은 기본적인 데이터 구조이므로 사용하는 것이 더 좋은 경우가 있습니다. 그러나 일반적인 경우에는 기본 데이터의 모서리를 둥글게 처리하는 고급 데이터 구조를 사용하십시오. C ++를 사용하면 메모리를 사용하여 매우 흥미롭고 유용한 작업을 수행 할 수 있습니다. 그 중 대부분은 단순한 배열로 작동합니다.
std::array
s 보다 더 근본적인 이유는 무엇입니까? 대부분의 경우 둘 다 동일한 어셈블리로 컴파일됩니다.
std::array
정적 배열 위에 구축 된 정확하게 정의 된 의미를가집니다.
내부적으로 STL 컨테이너를 사용해야하지만 서로 다른 모듈간에 이러한 컨테이너에 대한 포인터를 전달해서는 안됩니다. 그렇지 않으면 종속성 지옥에 빠지게됩니다. 예:
std::string foo;
// fill foo with stuff
myExternalOutputProc(foo.c_str());
아주 좋은 해결책이지만
std::string foo;
// fill foo with stuff
myExternalOutputProc(&foo);
그 이유는 std :: string은 다양한 방법으로 구현할 수 있지만 c 스타일 문자열은 항상 c 스타일 문자열이기 때문입니다.