code

C ++에서 배열을 사용해야합니까?

codestyles 2020. 8. 26. 07:55
반응형

C ++에서 배열을 사용해야합니까?


이후 std::liststd::vector존재처럼, C ++ 전통적인 C 배열을 사용하는 이유가있다, 또는 그들은 피해야한다 malloc?


std::array사용 가능한 C ++ 11에서 대답은 "예, 배열은 피해야합니다"입니다. C ++ 11 이전에는 자동 저장소 (예 : 스택)에 배열을 할당하기 위해 C 배열을 사용해야 할 수 있습니다.


확실히, std::arrayC ++ 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의 실제 데이터 구조로 인해 그들의 역할이 크게 줄어들 었다는 데 동의합니다.

또한 객체 내부의 캡슐화는 이와 같은 선택의 영향을 최소화해야한다고 말하고 싶습니다. 배열이 개인 데이터 멤버 인 경우 클래스의 클라이언트에 영향을주지 않고 배열을 교체 할 수 있습니다.


동적 메모리 할당을 사용할 수없는 안전에 중요한 시스템에서 작업했습니다. 메모리는 항상 스택에 있어야합니다. 따라서이 경우 컴파일 타임에 크기가 고정되므로 배열을 사용합니다.


arrayin c++은 동적 크기 std::vectorstd::list. std :: arrayc++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

반응형