짝수바이트로 패딩하는 문제에 관해서.

jw8704의 이미지

데이터(구조체포함) 을 짝수바이트로 패딩하는 이유는 CPU가 메모리로부터 데이터를 읽어올때 짝수byte 단위로 읽어오는 특성을 살리기 위해서 라고 알고있습니다.

그런데 이것은 원래 홀수 byte를 짝수 byte 로 늘려서 처리를 해야 그데이터의 처리를 위해 사용되는 시간이 줄어든다는 말이아니고..

그렇게 해야지만 다음 데이터가 위치하는 시작점이 짝수 번지가 되기 때문이겠지요?

이러한것을위해서는 두가지 전제 조건이 필요한데..

첫번째는, CPU는 항상 짝수 번지의 byte를 읽어온다.
두번째는, 짝수번지의 byte 를 읽어오는데 그시작점은 항상 짝수 번지부터 시작한다.
세번째는, 메모리에 저장되는 데이터는 앞서서 채워져있는 데이터번지 바로 다음부터 사용이된다.
(이것은 앞서서 채워져있는 데이터번지 다음 2n 지점부터 저장이되는것과 분명히 다른말이며 만약 메모리사용정책이 이렇게되어있다면 패딩을 하지않아도 될수있다고 생각함. 물론 이것은 어디까지나 차이점을 비교하기위한 말이며 이것이 효율적이될수있을거라는 의미는 아님.)

*일반적인 CPU는 위의 첫번째 두번째 조건에 따라 작동하는것으로 알고있고, 세번째조건은 잘모르겠는데 세번째 조건이 만족되어야 짝수크기로 처리하는 CPU 의 성능상의 장점을 활용하기위해 패딩하는것이 효과가 있을것같네요..

그래서 결과적으로 만약 어떤 데이터가 짝수번지에서 끝났는데 그뒤에 짝수 크기의 데이터가 올경우 그데이터는 시작번지는 홀수번지부터 시작하게되고 따라서 크기/2 횟수면 처리될수 있는 데이터가 크기/2 + 1 번 처리되어야 하는 단 1번의 횟수가 증가하게되는 문제가생긴다.
그런데 만약 홀수크기의 데이터가 온다면 그 홀수크기의 데이터는 짝수번지에서 시작되나 홀수번지에서 시작되나 어차피 2n>데이터크기 를 만족하는 가장작은 n 횟수 만큼 처리되므로 이경우에는 성능상의 차이가 나타나지 않는다.

물론 실제 처리 속도를 제외하고 어차피 짝수형태로 처리되는 시스템에서 실제처리된양을 가지고 효율을 따진다면 원래 홀수인데이터라도 크기를 늘려 짝수형태로 하는것이 수치상으로 실제 전송량을 늘려주는것이기야 하겠지만(하지만 어차피 내부적으로는 홀수라도 짝수만큼 읽어온다는 사실을 제외하면....) 사실 이경우에는 어차피 그데이터를 위해 처리되는 횟수는 홀수크기일때나 짝수크기일때나 똑같으므로 의미를 제외한 실제 처리속도 만을 놓고본다면 똑같은데.. 설마하니 홀수일때보다 그크기를 늘려서 짝수로했을때 오히려 그데이터만을 놓고 절대적비교로 두가지 경우의 처리속도를 비교했을때 짝수로 패딩한게 빨라지는건 아닐테고...또 실제처리 횟수상의 이득이아닌 결과적으로 바라본 상대적 효율을 높기이위해서 패딩을하는것도 아닐테고 왜 짝수로 패딩하는가 하는것에 궁금증을 갖고있다가 한번 날잡아서 생각해봐야지 하고있다가.. 생각해봤습니다.

그러니까 짝수단위로 패딩하는것은 쉽게말하면 딱 그데이터만 처리하고 말것이라면 그것이 원래 2보다 큰 홀수의 데이터를 데이터자체의 불필요한것을 빼서 원래의 데이터크기보다 작은 짝수 크기의 데이터로 변환하는경우라면 실제처리 시간이 줄어들지만 그것이아닌 원래 홀수크기의 데이터에
N(일반적으로N=1)바이트를 더해서 짝수크기로 패딩하는것은 원래 홀수크기의 데이터를 처리하는것보다 처리시간이 줄어들지도 또 늘어나지도 않는다. 단, 그데이터를 처리한다음 또다른 데이터를 처리해야할때 그리고 그것이 짝수크기의 데이터일때에는 이데이터를 처리하는데 드는 시간이 증가하므로 극대화해서 말한다면 한정적경우인 이 경우를 염려해서 패딩을 하는것이다..

이렇게 정리했는데 제 생각이 맞나요? 틀리면 알려주세요 감사합니다.

tj의 이미지

우선 짝수 바이트로 패딩을 하는 건 아니고 데이터 타입 크기에 따라 달라요. 어드레싱 사이즈 크기까진 데이터타입 크기에 맞춰서 얼라인 해주는게 보통이고, 얼라인먼트가 성능에 영향을 주는 부분도 다양해서 당장의 메모리 엑세스 뿐만 아니라 프리패치나 인스트럭션 리타이어먼트에 영향을 주기도 하구요.

프로세서 마다 다르니까 자세한 내용은 프로세서 메뉴얼을 참조하세요. 참고로 x86은 꽤 관대한 편이고, 아키텍쳐에 따라서는 얼라인이 맞지 않으면 오에스 폴트핸들러가 도와줘야 되는 경우도 있어요. x86은 구글에서 "intel architecture software optimization manual" 찾아서 memory access 부분 보시면 되고, 다른 아키텍쳐들도 메뉴얼에 메모리 접근 관련 부분에 얼라인먼트 요구사항과 맞지 않을 때 부작용들은 다 설명되어 있어요.