Step-by-Step
[Embedded] 구조체 멤버 메모리 할당 #Pragma 본문
구조체 멤버 Pack
- 구조체 멤버는 크기에 따라 1B / 2B / 4B / 8B 주소에만 만들어질 수 있음
- 컴파일러는 구조체 멤버의 alignment 규정을 조정하는 옵션이 있음
- CPU가 메모리에 접근할 때 (32bit CPU → 4B 단위 // 64bit CPU → 8B 단위)
- 32bit CPU → 4B 단위, 64bit CPU → 8B 단위로 접근하는데 단위보다 작은 데이터에 접근하는 경우 시브트 연산으로 속도 효율이 저하됨
#pragma pack(N)
- 구조체 멤버가 차지하고 있는 메모리를 alignment 하는 옵션
- 데이터의 크기를 정해진 단위로 정렬
- 구조체의 크기를 1, 2, 4, 8, 16 Bytes 단위로 alignment 한다. (default : 8)
- pack 사용시 구조체의 크기는 가장 큰 멤버가 N보다 크면 N의 배수로 제한됨
- 가장 큰 멤버가 N보다 같거나 작으면 전체 크기는 가장 큰 멤버의 배수로 생성
N=1 | N=2 | N=4 | N=8 | |
1B | 임의 주소 | 임의 주소 | 임의 주소 | 임의 주소 |
2B | 임의 주소 | 2의 배수 주소 | 2의 배수 주소 | 2의 배수 주소 |
4B | 임의 주소 | 2의 배수 주소 | 4의 배수 주소 | 4의 배수 주소 |
8B | 임의 주소 | 2의 배수 주소 | 4의 배수 주소 | 8의 배수 주소 |
push pop
- pack이 사용되면 구조체 멤버가 unaligned 되어 엑세스 속도가 저하됨
- pack은 필요한 곳에서만 사용하고 반드시 원래의 pack으로 복원해야 함
#include <stdio.h>
#pragma pack(push, 1) // 1바이트 정렬로 패킹
struct PackStruct {
char a;
int b;
short c;
};
#pragma pack(pop) // 이전 패킹 설정으로 복구
int main() {
return 0;
}
특징
1. 정렬 및 성능
패킹을 사용하면 메모리 사용을 줄일 수 있음
구조체 멤버 내 정렬되지 않아 CPU의 메모리 접근 성능이 저하될 수 있음
2. 호환성
패킹된 구조체는 하드웨어나 파일 포맷과의 호환성을 맞추기 위해 필요
3. 안전성
패킹을 사용할 때 구조체의 크기와 정렬에 대한 이해가 필요
특정 플랫폼이나 컴파일러에서의 동작을 확인해야 함
'임베디드 > Embedded C' 카테고리의 다른 글
[Embedded] DMA (0) | 2024.09.26 |
---|---|
[Embedded] UART (0) | 2024.09.24 |
[C] 매크로 #define (0) | 2024.09.24 |
Comments