c++ 배열보다 std::array 를 쓰자

일반적인 정적 사이즈를 선언할 경우에도 배열보다는
std::array 를 사용하는 편이 좀더 장점이 있다

int cArr[3] = { 1,2,3 };

std::array<int, 3> stdArr = { 1,2,3 };

c style 고정 사이즈 배열
c++11 이후 std::array

https://en.cppreference.com/w/cpp/container/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 기반으로 짜둔 상태의 차이로

두 방식을 서로 다른 함수로 나누어 비교해보면 더 홗실히 실제 차이점을 알 수가 있을것

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다