IT story

이제 std :: array가 생겼으니 C 스타일 배열의 용도는 무엇입니까?

hot-time 2020. 9. 16. 20:58
반응형

이제 std :: array가 생겼으니 C 스타일 배열의 용도는 무엇입니까?


std::arrayC 배열보다 훨씬 우수합니다. 레거시 코드와 상호 운용하려는 경우에도 std::array::data(). 내가 구식 배열을 원하는 이유가 있습니까?


내가 놓친 것이 아니라면 (최근의 표준 변경 사항을 너무 가깝게 따르지 않았 음) 대부분의 C 스타일 배열 사용은 여전히 ​​남아 있습니다. std::array정적 초기화를 허용하지만 여전히 이니셜 라이저를 계산하지 않습니다. 그리고 이전에 C 스타일 배열의 유일한 실제 사용은 std::array다음 행을 따라 정적으로 초기화 된 테이블에 대한 것이기 때문 입니다.

MyStruct const table[] =
{
    { something1, otherthing1 },
    //  ...
};

일반 beginend템플릿 함수 (C ++ 11에서 채택)를 사용하여 반복합니다. 컴파일러가 이니셜 라이저 수에서 결정하는 크기는 언급하지 않습니다.

편집 : 내가 잊은 또 다른 점 : 문자열 리터럴은 여전히 ​​C 스타일 배열입니다. 즉 유형 char[]. 나는 우리가 .NET을 가지고 있기 때문에 누군가가 문자열 리터럴 사용을 제외 할 것이라고 생각하지 않습니다 std::array.


아뇨 .. 솔직히 말 해서요 그리고 30 자입니다.

물론를 구현하려면 C 배열이 필요 std::array하지만 이것이 실제로 사용자가 C 배열을 원하는 이유는 아닙니다. 또한, 아니, std::arrayC 배열보다 확대됨에없는, 그리고 경계 - 검사 액세스를위한 옵션이 있습니다. 마지막으로 모든 C ++ 프로그램이 표준 라이브러리에 의존하는 것이 완전히 합리적입니다. 즉, 표준 라이브러리에 액세스 할 수없는 경우 컴파일러가 표준 라이브러리를 따르지 않고 질문은 "C ++"가 아니라 "C ++"로 태그가 지정되어 있으며, 부적절하다고 느꼈기 때문에 사양의 절반을 놓친 C ++가 아닌 것입니다. "


다차원 배열을 사용하는 것이 C 배열보다 std::array. 예를 들어

char c_arr[5][6][7];

반대로

std::array<std::array<std::array<char, 7>, 6>, 5> cpp_arr;

또한 C 배열의 자동 감쇠 속성으로 인해 c_arr[i]위의 예에서 포인터로 감쇠하고 나머지 차원을 두 개의 추가 매개 변수로 전달하면됩니다. 내 요점은 c_arr복사하는 데 비싸지 않다는 입니다. 그러나 cpp_arr[i]복사하는 데 비용이 많이 듭니다.


Sumant가 말했듯이 다차원 배열은 .NET보다 내장 C 배열과 함께 사용하기가 훨씬 쉽습니다 std::array.

중첩되면 std::array읽기가 매우 어려워지고 불필요하게 장황해질 수 있습니다.

예를 들면 :

std::array<std::array<int, 3>, 3> arr1; 

에 비해

char c_arr[3][3]; 

또한, 참고 begin(), end()size()모든 반환 의미 값을 때 둥지 std::array.

이러한 이유로 고정 크기의 다차원 배열 컨테이너 array_2darray_3d. 유사 std::array하지만 2 차원 및 3 차원의 다차원 배열에 사용됩니다. 내장 된 다차원 배열보다 더 안전하고 성능이 나쁘지 않습니다. 흔하지 않기 때문에 차원이 3보다 큰 다차원 배열에 대한 컨테이너를 포함하지 않았습니다. C ++ 0x에서는 임의의 차원 수를 지원하는 가변 템플릿 버전을 만들 수 있습니다.

2 차원 변형의 예 :

//Create an array 3 x 5 (Notice the extra pair of braces) 

fsma::array_2d <double, 3, 5> my2darr = {{
    { 32.19, 47.29, 31.99, 19.11, 11.19},
    { 11.29, 22.49, 33.47, 17.29, 5.01 },
    { 41.97, 22.09, 9.76, 22.55, 6.22 }
}};

전체 문서는 여기에서 볼 수 있습니다.

http://fsma.googlecode.com/files/fsma.html

여기에서 라이브러리를 다운로드 할 수 있습니다.

http://fsma.googlecode.com/files/fsma.zip


C ++에서 사용할 수있는 C 스타일 배열은 실제로 실제 C 배열보다 훨씬 덜 다재다능합니다. 차이점은 C에서는 배열 유형이 런타임 크기를 가질 수 있다는 것 입니다. 다음은 유효한 C 코드이지만 C ++ C 스타일 배열이나 C ++ array<>유형 으로 표현할 수 없습니다 .

void foo(int bar) {
    double tempArray[bar];
    //Do something with the bar elements in tempArray.
}

C ++에서는 힙에 임시 배열을 할당해야합니다.

void foo(int bar) {
    double* tempArray = new double[bar];
    //Do something with the bar elements behind tempArray.
    delete[] tempArray;
}

컴파일 타임에 알려지지 std::array<>않았기 때문에 에서는이를 달성 할 수 없습니다 . barC ++ 또는의 C 스타일 배열을 사용해야합니다 std::vector<>.


첫 번째 예는 비교적 용이 (요구되는 이나마 ++ C로 표현 될 수 있지만 new[]하고 delete[], 다음은 C ++없이 달성 될 수있다) std::vector<>:

void smoothImage(int width, int height, int (*pixels)[width]) {
    int (*copy)[width] = malloc(height*sizeof(*copy));
    memcpy(copy, pixels, height*sizeof(*copy));
    for(y = height; y--; ) {
        for(x = width; x--; ) {
            pixels[y][x] = //compute smoothed value based on data around copy[y][x]
        }
    }
    free(copy);
}

The point is, that the pointers to the line arrays int (*)[width] cannot use a runtime width in C++, which makes any image manipulation code much more complicated in C++ than it is in C. A typical C++ implementation of the image manipulation example would look like this:

void smoothImage(int width, int height, int* pixels) {
    int* copy = new int[height*width];
    memcpy(copy, pixels, height*width*sizeof(*copy));
    for(y = height; y--; ) {
        for(x = width; x--; ) {
            pixels[y*width + x] = //compute smoothed value based on data around copy[y*width + x]
        }
    }
    delete[] copy;
}

This code does precisely the same calculations as the C code above, but it needs to perform the index computation by hand wherever the indices are used. For the 2D case, this is still feasible (even though it comes with a lot of opportunities to get the index calculation wrong). It gets really nasty in the 3D case, though.

I like writing code in C++. But whenever I need to manipulate multidimensional data, I really ask myself whether I should move that part of the code to C.


May be the std::array is not slow. But I did some benchmarking using simple store and read from the std::array; See the below benchmark results (on W8.1, VS2013 Update 4):

ARR_SIZE: 100 * 1000
Avrg = Tick / ARR_SIZE;

test_arr_without_init
==>VMem: 5.15Mb
==>PMem: 8.94Mb
==>Tick: 3132
==>Avrg: 0.03132
test_arr_with_init_array_at
==>VMem: 5.16Mb
==>PMem: 8.98Mb
==>Tick: 925
==>Avrg: 0.00925
test_arr_with_array_at
==>VMem: 5.16Mb
==>PMem: 8.97Mb
==>Tick: 769
==>Avrg: 0.00769
test_c_arr_without_init
==>VMem: 5.16Mb
==>PMem: 8.94Mb
==>Tick: 358
==>Avrg: 0.00358
test_c_arr_with_init
==>VMem: 5.16Mb
==>PMem: 8.94Mb
==>Tick: 305
==>Avrg: 0.00305

According to the negative marks, the code I used is in the pastebin (link)

The benchmark class code is here;

I don't know a lot about benchmarkings... My code may be flawed


  1. to implement something like std::array
  2. if you don't want to use the STL or can't
  3. For performance

참고URL : https://stackoverflow.com/questions/6111565/now-that-we-have-stdarray-what-uses-are-left-for-c-style-arrays

반응형