다음 두개의 구조체의 크기가 다릅니다.
글쓴이: gsong / 작성시간: 목, 2003/10/02 - 10:43오전
typedef struct { int num_data1; char str_data1[20]; char str_data2[14]; int num_data2; char str_data3[14]; } t_data1; typedef struct { int num_data1; int num_data2; char str_data1[20]; char str_data2[14]; char str_data3[14]; } t_data2;
위 의 두 개의 구조체를 sizeof() 해서 찍어보면 크기다 다르게 나옵니다.
둘다 56 이어야 되지만, t_data1 의 경우는 크기가 60이 나옵니다.
주소 값을 찍어 확인 을 해보니 str_data2 와 str_data3 뒤에 2바이트씩 더 붙는 것 같습니다.
아마 int 변수 때문인 것 같습니다만,
누가 자세히 설명 좀 해주셨으면 감사하겠습니다
Forums:
[code:1]typedef struct {
32비트 환경에서는 한번에 4바이트씩 처리하므로 성능향상을 위해서 컴파일러가 임의로 구조체를 변경시킨듯합니다..
즉 가운데 낀 t_data1의 int um_data2 를 메모리에서 한큐에 읽을수 있도록 자리조정을 한듯 생각됩니다.
그리고 뒤에 붙은 2바이트는 58이되느니 메모리도 많이 남으로 60으로 하는게 성능향상에 도움될꺼라 컴파일러가 생각했는가 봅니다.. 막연히 최적화 옵션을 조정하면 바꿜꺼라 생각되네요..
추가로 어셈으로 임베디드 16비트 환경에서 변수잡을때 8비트는 아무번지에나 넣을수 있었지만, 16비트 워드형을 넣을때는 꼭 짝수번지에 넣어줘야 했었습니다...
--
Linux강국 KOREA
http://ydongyol.tistory.com/
바이트정렬 문제때문입니다..
컴파일러 기본옵션에서 구조체는 일반적으로 4바이트 정렬이 되고
또한 int 타입 역시 4의 배수(sizeof(int)) 에 되는 주소에 위치해야되므로 그렇게 나옵니다.
str_data2, str_data3 를 16바이트로해도 같은 크기가 나옵니다.
컴파일러(gcc) 옵션중 정렬에 대한 것이 있습니다. gcc 메뉴얼을 읽어보세요.
폐인, 노가다 그 끝은..?

Re: 다음 두개의 구조체의 크기가 다릅니다.
구조체 정렬은 성능 향상 및 특정 시스템에서 bus error 를 피하기 위해 행해집니다.
32비트 시스템이라해도 항상 4바이트로 정렬되는 것은 아니고 most restrictive size 에 의해 행해집니다. 단지, 지금 말씀하신 예에서 most restrictive size 는 sizeof(int) 입니다. 예를들어 short 나 double 이 그것이 될 수도 있습니다.
구조체 정렬의 가장 기본 원리는, n바이트 크기를 갖는 멤버는 n 배수 주소상에 배치된다는 것입니다. num_data2 가 4바이트 이므로, 4배수 주소상에 배치되려면 예로 드신 처음 구조체에서 str_data2 뒤에 2바이트의 padded bytes 가 삽입되게 되죠.
덧붙여, 이런 규칙으로 인해, 이진데이터를 파일로부터 읽어들이거나, 이기종간에 이진데이터를 네트워크로 전송할 때, 바이트오더와 함께 구조체 정렬도 세심히 고려되어야 합니다.
Orion Project : http://orionids.org
정 padding이 싫으시면 packed 옵션을 붙여주면 됩니다.
정 padding이 싫으시면 packed 옵션을 붙여주면 됩니다.
그대신 속도가 느려지는 것은 각오해야겠죠.
Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24
Re: 다음 두개의 구조체의 크기가 다릅니다.
이렇게 하면 거의 모든 컴파일러에서 잘 됩니다. 아마 HPUX 10 gcc 2.95 에서는 윗분처럼하는것만 되던 경험이 있습니다.
---
http://coolengineer.com
ISO C 표준을 보시면, struct 또는 union의 크기가 그 me
ISO C 표준을 보시면, struct 또는 union의 크기가 그 member들의 크기와 같다는 보장을 할 수 없다고 나옵니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기