이제 std :: array가 생겼으니 C 스타일 배열의 용도는 무엇입니까?
std::array
C 배열보다 훨씬 우수합니다. 레거시 코드와 상호 운용하려는 경우에도 std::array::data()
. 내가 구식 배열을 원하는 이유가 있습니까?
내가 놓친 것이 아니라면 (최근의 표준 변경 사항을 너무 가깝게 따르지 않았 음) 대부분의 C 스타일 배열 사용은 여전히 남아 있습니다. std::array
정적 초기화를 허용하지만 여전히 이니셜 라이저를 계산하지 않습니다. 그리고 이전에 C 스타일 배열의 유일한 실제 사용은 std::array
다음 행을 따라 정적으로 초기화 된 테이블에 대한 것이기 때문 입니다.
MyStruct const table[] =
{
{ something1, otherthing1 },
// ...
};
일반 begin
및 end
템플릿 함수 (C ++ 11에서 채택)를 사용하여 반복합니다. 컴파일러가 이니셜 라이저 수에서 결정하는 크기는 언급하지 않습니다.
편집 : 내가 잊은 또 다른 점 : 문자열 리터럴은 여전히 C 스타일 배열입니다. 즉 유형 char[]
. 나는 우리가 .NET을 가지고 있기 때문에 누군가가 문자열 리터럴 사용을 제외 할 것이라고 생각하지 않습니다 std::array
.
아뇨 .. 솔직히 말 해서요 그리고 30 자입니다.
물론를 구현하려면 C 배열이 필요 std::array
하지만 이것이 실제로 사용자가 C 배열을 원하는 이유는 아닙니다. 또한, 아니, std::array
C 배열보다 확대됨에없는, 그리고 경계 - 검사 액세스를위한 옵션이 있습니다. 마지막으로 모든 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_2d
및 array_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<>
않았기 때문에 에서는이를 달성 할 수 없습니다 . bar
C ++ 또는의 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
- to implement something like
std::array
- if you don't want to use the STL or can't
- For performance
'IT story' 카테고리의 다른 글
WPF UserControl은 어떻게 WPF UserControl을 상속 할 수 있습니까? (0) | 2020.09.16 |
---|---|
g ++로 다중 스레드 코드 컴파일 (0) | 2020.09.16 |
항상`except` 문에 예외 유형을 지정해야합니까? (0) | 2020.09.16 |
버퍼 비우기 란 무엇을 의미합니까? (0) | 2020.09.16 |
PowerShell`profile.ps1` 파일에는 무엇이 있습니까? (0) | 2020.09.16 |