일반적인 정적 사이즈를 선언할 경우에도 배열보다는
std::array 를 사용하는 편이 좀더 장점이 있다
int cArr[3] = { 1,2,3 }; std::array<int, 3> stdArr = { 1,2,3 };
c style 고정 사이즈 배열
c++11 이후 std::array
c style 고정 array 보다 더 많은걸 쉽게 할 수 있다
stl 스타일 iterator 를 사용 할 수도있고
algorithm 을 바로 적용해 sort 도 할 수 있으며
당연히 관련 함수를 사용할 수 있고
배열의 사이즈를 별도로 기록해두고 사용하지 않아도 된다
size() 함수를 사용할 수 있으니까
#include <stdio.h> #include <array> void testfunc() { int cArr[3] = { 1,2,3 }; std::array<int, 3> stdArr = { 1,2,3 }; printf("%d < cArr\n", sizeof(cArr)); printf("%d < stdArr\n", sizeof(stdArr)); for (auto el : cArr) { printf("%d", el); } for (auto el : stdArr) { printf("%d", el); } }
실행결과는
#include <stdio.h> #include <array> void testfunc() { 00875EF0 push ebp 00875EF1 mov ebp,esp 00875EF3 sub esp,14Ch 00875EF9 push ebx 00875EFA push esi 00875EFB push edi 00875EFC lea edi,[ebp-14Ch] 00875F02 mov ecx,53h 00875F07 mov eax,0CCCCCCCCh 00875F0C rep stos dword ptr es:[edi] 00875F0E mov eax,dword ptr [__security_cookie (087C004h)] 00875F13 xor eax,ebp 00875F15 mov dword ptr [ebp-4],eax 00875F18 mov ecx,offset _DB90BD3F_codeTest@cpp (087E029h) 00875F1D call @__CheckForDebuggerJustMyCode@4 (0871370h) int cArr[3] = { 1,2,3 }; 00875F22 mov dword ptr [cArr],1 00875F29 mov dword ptr [ebp-10h],2 00875F30 mov dword ptr [ebp-0Ch],3 std::array<int, 3> stdArr = { 1,2,3 }; 00875F37 mov dword ptr [stdArr],1 00875F3E mov dword ptr [ebp-24h],2 00875F45 mov dword ptr [ebp-20h],3 printf("%d < cArr\n", sizeof(cArr)); 00875F4C push 0Ch 00875F4E push offset string "%d < cArr" (0879B30h) 00875F53 call __JustMyCode_Default (0871424h) 00875F58 add esp,8 printf("%d < stdArr\n", sizeof(stdArr)); 00875F5B push 0Ch 00875F5D push offset string "%d < stdArr\n" (0879CE0h) 00875F62 call __JustMyCode_Default (0871424h) 00875F67 add esp,8 for (auto el : cArr) { 00875F6A lea eax,[cArr] 00875F6D mov dword ptr [ebp-34h],eax 00875F70 mov eax,dword ptr [ebp-34h] 00875F73 mov dword ptr [ebp-40h],eax 00875F76 mov eax,dword ptr [ebp-34h] 00875F79 add eax,0Ch 00875F7C mov dword ptr [ebp-4Ch],eax 00875F7F jmp testfunc+9Ah (0875F8Ah) 00875F81 mov eax,dword ptr [ebp-40h] 00875F84 add eax,4 00875F87 mov dword ptr [ebp-40h],eax 00875F8A mov eax,dword ptr [ebp-40h] 00875F8D cmp eax,dword ptr [ebp-4Ch] 00875F90 je testfunc+0BDh (0875FADh) 00875F92 mov eax,dword ptr [ebp-40h] 00875F95 mov ecx,dword ptr [eax] 00875F97 mov dword ptr [ebp-58h],ecx printf("%d", el); 00875F9A mov eax,dword ptr [ebp-58h] 00875F9D push eax 00875F9E push offset string "%d" (0879BE8h) 00875FA3 call __JustMyCode_Default (0871424h) 00875FA8 add esp,8 } 00875FAB jmp testfunc+91h (0875F81h) for (auto el : stdArr) { 00875FAD lea eax,[stdArr] 00875FB0 mov dword ptr [ebp-64h],eax 00875FB3 mov ecx,dword ptr [ebp-64h] 00875FB6 call std::array<int,3>::_Unchecked_begin (0871438h) 00875FBB mov dword ptr [ebp-70h],eax 00875FBE mov ecx,dword ptr [ebp-64h] 00875FC1 call std::array<int,3>::_Unchecked_end (087143Dh) 00875FC6 mov dword ptr [ebp-7Ch],eax 00875FC9 jmp testfunc+0E4h (0875FD4h) 00875FCB mov eax,dword ptr [ebp-70h] 00875FCE add eax,4 00875FD1 mov dword ptr [ebp-70h],eax 00875FD4 mov eax,dword ptr [ebp-70h] 00875FD7 cmp eax,dword ptr [ebp-7Ch] 00875FDA je testfunc+10Dh (0875FFDh) 00875FDC mov eax,dword ptr [ebp-70h] 00875FDF mov ecx,dword ptr [eax] 00875FE1 mov dword ptr [ebp-88h],ecx printf("%d", el); 00875FE7 mov eax,dword ptr [ebp-88h] 00875FED push eax 00875FEE push offset string "%d" (0879BE8h) 00875FF3 call __JustMyCode_Default (0871424h) 00875FF8 add esp,8 } 00875FFB jmp testfunc+0DBh (0875FCBh) }
disasm 한 결과를 보면 실제 배열을 할당하는 데 까지의 내용은 크게 차이도 없다
따라서 사이즈도 4*3 = 12 바이트
두가지 타입 모두 당연하게 ranged base for 사용가능하고
관련 disasm 에서의 차이는 대략 루프를 도는 기준이 begin/end 인것의 차이
랜덤 엑세스 도 모두 가능하고 .. 유연하게 코드를 리팩토링 하면서 다른 컨테이너로 교체하기도 수월하겠다
관련코드를 랜덤엑세스로만 짜둔상태와 std iterator 기반으로 짜둔 상태의 차이로
댓글 남기기