C ++에서 배열을 사용해야합니까?
이후 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 스타일 배열을 선호하는 유효한 이유입니다.
"절대"라고 말하지 마십시오.하지만 STL의 실제 데이터 구조로 인해 그들의 역할이 크게 줄어들 었다는 데 동의합니다.
또한 객체 내부의 캡슐화는 이와 같은 선택의 영향을 최소화해야한다고 말하고 싶습니다. 배열이 개인 데이터 멤버 인 경우 클래스의 클라이언트에 영향을주지 않고 배열을 교체 할 수 있습니다.
동적 메모리 할당을 사용할 수없는 안전에 중요한 시스템에서 작업했습니다. 메모리는 항상 스택에 있어야합니다. 따라서이 경우 컴파일 타임에 크기가 고정되므로 배열을 사용합니다.
array
in c++
은 동적 크기 std::vector
및 std::list
. std :: array 는 c++11
. 표준 컨테이너의 이점을 제공하는 동시에 C 스타일 배열의 집계 유형 의미를 제공합니다.
그래서 c++11
나는 확실히 std::array
필요한 곳에서 벡터를 사용합니다. 하지만 나는 C++03
.
대부분의 경우, 아니요 , 원시 배열을 사용하는 이유를 생각할 수 없습니다 vectors
. 코드가 새 .
라이브러리가 배열 및 원시 포인터를 예상하는 코드와 호환되어야하는 경우 배열을 사용해야 할 수 있습니다.
많은 사람들이 스택에 배열을 할당하기 위해 std :: array를, 힙에 대해 std :: vector를 지적하고 있음을 알고 있습니다. 그러나 둘 다 비 네이티브 정렬을 지원하지 않는 것 같습니다. SSE 또는 VPX 명령어를 사용하려는 모든 종류의 숫자 코드를 수행하는 경우 (따라서 각각 128 또는 256 바이트 정렬이 필요함) C 배열이 여전히 최선의 방법 인 것처럼 보입니다.
적은 양의 정적 데이터를 저장하는 경우 배열이 여전히 유용하다고 말하고 싶습니다.
std::vector
내가 생각할 수있는 것 보다 배열의 유일한 장점 (물론 필요할 때 자동으로 할당 해제를 관리하는 것으로 래핑 됨) 은 vector
컴파일러가 C ++ 11 및 이동 생성자를 지원하지 않는 한 데이터의 소유권을 전달할 수 없다는 것입니다.
C 스타일 배열은 기본적인 데이터 구조이므로 사용하는 것이 더 좋은 경우가 있습니다. 그러나 일반적인 경우에는 기본 데이터의 모서리를 둥글게 처리하는 고급 데이터 구조를 사용하십시오. C ++를 사용하면 메모리를 사용하여 매우 흥미롭고 유용한 작업을 수행 할 수 있습니다. 그 중 대부분은 단순한 배열로 작동합니다.
내부적으로 STL 컨테이너를 사용해야하지만 다른 모듈간에 이러한 컨테이너에 대한 포인터를 전달해서는 안됩니다. 그렇지 않으면 종속성 지옥에 빠질 것입니다. 예:
std::string foo;
// fill foo with stuff
myExternalOutputProc(foo.c_str());
아주 좋은 해결책이지만
std::string foo;
// fill foo with stuff
myExternalOutputProc(&foo);
The reason is that std::string can be implemented in many different ways but a c-style string is always a c-style string.
참고URL : https://stackoverflow.com/questions/10718061/should-arrays-be-used-in-c
'code' 카테고리의 다른 글
Python 3을 실행하기 위해 IPython 노트북을 얻는 방법? (0) | 2020.08.27 |
---|---|
SQL Server의 이상한 작동 문제 (-100 / -100 * 10 = 0) (0) | 2020.08.27 |
힘내 : 새 원격 분기를 볼 수 없습니다. (0) | 2020.08.26 |
jQuery UI 대화 상자가 열려 있는지 감지 (0) | 2020.08.26 |
별도의 스레드에서 실행되는 iPhone iOS (0) | 2020.08.26 |