Step-by-Step

[Embedded] 구조체 멤버 메모리 할당 #Pragma 본문

임베디드/Embedded C

[Embedded] 구조체 멤버 메모리 할당 #Pragma

희주(KHJ) 2024. 9. 6. 15:36

구조체 멤버 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