[2023/09/07] First Start.
이 코드는 ide.goorm.io에서 테스트 되었습니다.
소나무 기운 , 전자제품 개발/생산
C언어에서 구조체의 크기가 (sizeof()) 다른 이유
같은 구조체의 sizeof()결과갑이 다른 경우이 생깁니다.
mcu 및 컴파일러의 bit수에 따라 달라지는 경우가 대부분입니다.
8bit 컴파일러와 16bit, 32bit컴파일의 sizeof(구조체)의 크기가 다른 이유에 대해서 알아봅니다.
C언어에서 구조체의 크기 규칙 두가지
하나. 각각의 멤버를 저장하기 위해서는 기본 4바이트 단위로 구성됩니다.
둘. 구조체 각 멤버 중에서 가장 큰 멤버의 크기에 영향을 받습니다.
예를 들어, 다음과 같은 구조체를 선언했다고 가정해 봅니다.
struct S {
char a;
int b;
double c;
};
이 구조체의 크기는 8바이트 입니다. a는 1바이트, b는 4바이트, c는 8바이트이기 때문에, 구조체의 크기는 이중 가장 큰 8바이트로 결정이됩니다.
이러한 구조체의 크기 결정 규칙은 MCU의 종류나 CPU의 종류에 따라 다를 수 있습니다. 예를 들어, 8비트 MCU에서는 1바이트 단위로 구조체의 크기가 결정될 수 있으며, 64비트 CPU에서는 8바이트 단위로 구조체의 크기가 결정될 수 있습니다.
그래서 총 16바이트의 값을 가지게 됩니다.
두가지 극복 방법에 대해 알아봅니다.
구조체 멤버의 크기를 지정합니다.
구조체 멤버의 크기를 지정하면, 구조체의 크기가 멤버의 크기에 따라 정확하게 계산됩니다.
예를 들어, 다음과 같이 구조체를 선언하면, 구조체의 크기는 16바이트가 됩니다.
#include <stdio.h>
struct S {
char a;
int b;
double c;
};
int main(int argc, char* argv[]) {
struct S tS;
printf("size of tS %ld!\n", sizeof(struct S));
return 0;
}
결과값 : size of tS 16!
#pragma pack() 지시자를 사용합니다.
#progma pack() 지시자를 사용하면, 구조체의 멤버를 지정된 단위로 정렬하여 구조체이 크기를 조정할 수 있습니다. 예를 들어, 다음과 같이 구조체를 선언하면 , 구조체의 크기는 16바이트와 13바이트가 됩니다.
#include <stdio.h>
struct S {
char a;
int b;
double c;
};
// 구조체의 멤버를 1바이트 단위로 정렬합니다.
#pragma pack(1)
struct S2 {
char a;
int b;
double c;
};
int main(int argc, char* argv[]) {
struct S tS;
struct S2 tS2;
printf("size of tS %ld!\n", sizeof(struct S));
printf("size of tS2 %ld!\n", sizeof(struct S2));
return 0;
}
결과값 :
size of tS 16!
size of tS2 13!
#include <stdio.h>
#include <stdint.h>
struct S {
char a;
int b;
double c;
};
// 구조체의 멤버를 1바이트 단위로 정렬합니다.
#pragma pack(1)
struct S2 {
char a;
int b;
double c;
};
struct S3 {
uint8_t a : 8;
uint16_t b : 16;
uint32_t c : 32;
};
int main(int argc, char* argv[]) {
struct S tS;
struct S2 tS2;
struct S3 tS3;
printf("size of tS %ld!\n", sizeof(struct S));
printf("size of tS2 %ld!\n", sizeof(struct S2));
printf("size of tS3 %ld!\n", sizeof(struct S3));
return 0;
}
bit를 지정하여 처리하는 방법도 있습니다.
결과갑 :
size of tS 16!
size of tS2 13!
size of tS3 7!
마무리
구조체 선언을 서로 다른 MCU에서 공유하는 경우에는 구조체의 크기가 동일하도록 해야 합니다. 이를 위해서는 다음과 같은 방법이 있습니다.
1. 구조체 멤버의 크기를 지정합니다.
구조체 멤버의 크기를 지정하면, 구조체의 크기가 멤버의 크기에 따라 정확하게 계산되므로, 다른 MCU에서도 동일한 크기를 가지게 됩니다.
2. #pragma pack()지시자를 사용합니다.
#pragma pack() 지시자를 사용하면, 구조체의 멤버를 지정된 단위로 정렬하여 구조체의 크기를 조정할 수 있습니다. 이를 통해, 서로 다른 MCU에서 구조체의 크기가 동일하도록 할 수 있습니다.
3. 구조체를 공유하는 MCU의 종류에 맞게 구조체를 수정합니다.
구조체의 크기가 MCU의 종류에 따라 다르므로, 서로 다른 MCU에서 공유하는 경우에는 구조체를 수정하여 크기를 동일하게 맞추어야 합니다. 이는 구조체의 멤버를 제거하거나 크기를 조정하여 이루어질 수 있습니다.
참고문헌
틀린 부분이나 질문은 댓글 달아주세요.
즐거운 하루 보내세요. 감사합니다.
'Python, C, C++' 카테고리의 다른 글
(C) float를 uint16_t 2개에 나누어 저장하는 방법 (To save float by dividing it into two uint16_t) (0) | 2023.03.04 |
---|---|
'MergeCells' method of a 'TStringGrid' in C++ Builder(C++ Builder에서 'TSring Grid'의 'Merge Cells' 방법) (0) | 2023.03.01 |
strcmp [C][C++][python] (0) | 2022.04.04 |
Example of Python using tkinter module. (0) | 2022.02.24 |
python tkinter 이용 GUI 기본 예제 (0) | 2022.02.23 |
댓글