동일한 내용의 정보를 가지는 개념적으로는 똑같은 사이즈인 두개의 구조체가 있다.
64비트에서 컴파일해보면 이 두개의 구조체는 각각 다른 사이즈를 가진다.
물론 #pragma pack(push,1)을 주면 똑같은 사이즈로 컴파일 된다.
STRUCT_ALIGNED의 크기는 32바이트고 STRUCT_UNALIGNED의 크기는 40바이트다.
STRUCT_UNALIGNED구조체의 경우 1차적으로 패널티를 피하기 위해서 변수별로 padding이 들어간다.
변수마다 억세스 단위만큼의 얼라인을 맞추게 되고 최종적으로 구조체가 배열로 잡히더라도 8바이트에 얼라인 될 수있도록 사이즈가 8의 배수로 잡힌다.
STRUCT_ALIGNED의 경우는 모든 변수가 패널티 없이 억세스할 수 있다. 최종적으로 8의 배수로 잡히기 위해 마지막 4바이트 padding만 붙는다.
물론 나는 전자와 같이 코딩해야 한다고 생각한다.
라이트맵 구울때라든가 패치 사이즈를 줄여야하는 경우에 얼라인을 고려하면 사이즈를 줄일 수 있다. 사이즈가 줄어들어 캐쉬히트 가능성도 높아진다.
음 근데 “성능과 메모리절약을 위해서 얼라인을 고려하자.”라고 하는건 아니다.
사실 대부분의 경우 성능차이는 미비하다. 몇몇 경우를 제외하고 메모리 사이즈도 크게 차이나지 않는다.
나도 잘 안다. 그럼에도 이런 얘길 왜 햐느냐.
남이 짠 코드를 볼때 얼라인을 고려해서 쓰여진 코드를 보면 굉장히 신뢰가 간다. 한땀한땀 신경써서 짜는거거나, 프로그램 많이 짜봤구나. 그런 생각이 든다.
반면 얼라인이 엉망인 코드를 보면 엄청난 불신이 생긴다. 이 사람이 짠 코드 믿어도 되는거야?
남이 짠 코드 보다가 생각이 나서 적어봤다.
얼라인이 엉망이라 굉장히 거슬리네. 뭐 코드 맘에 안드는 부분이 구조체 얼라인 뿐만이 아니지만.-_-;