Software/Embedded system

Sizeof()for struct and pointer with pack()  64bit system

neovaga 2022. 6. 4. 19:48

64bit system을 사용하게 되면 기본적으로 알아야 하는 메모리 구조와 Struct 의 사이즈에 대해서 알아봤다. 

64bit system에서 사용되는 메모리에 접근해서 처리하는 단위가 8byte 로 되어 있다고 보면 된다. 그래서 포인터의 사이즈를 읽어 보면 8byte로 되어 있다.

  • 32 bit system (x86): 4byte 단위
  • 64 bit system (x64): 8byte 단위

구조체에서는 멤버변수중에서 제일 큰 사이즈에 맞추어져서 패딩이 된다. 그래서 구조체의 사이즈를 읽어보면 패딩된 부분에 의해서 사이즈가 크게 읽히게 된다. 이렇게 시스템에서 한번에 읽기 좋은 구조로 패딩이 되면 빠른 처리가 되게 되지만 실제로는 메모리를 낭비하게 되고 각비트별로 값을 담아서 전달을 할때는 해당 값의 의미를 놓치게 되는 경우가 발생한다. 예를 들어서 Packet 전송 했을때 이 값을 상대방에서 비트별로 읽어버리면 공백값을 나올 수도 있다. 

 #pragma pack() 전처리를 사용하게 되면 각 메모리를 묶을 수 있게 된다. 

#include <stdio.h>

typedef struct padding_1
{
	char c_1;
	int i_1;
	char c_2;
}padding_1;

#pragma pack(1)
typedef struct padding_2
{
	char c_1;
	int i_1;
	char c_2;
}padding_2;
#pragma pack(push,2)
typedef struct padding_3
{
	char c_1;
	int i_1;
	char c_2;
}padding_3;
#pragma pack(pop)
typedef struct padding_4
{
	char c_1;
	int i_1;
	char c_2;
}padding_4;

#pragma pack()
typedef struct padding_5
{
	char c_1;
	long i_1;
	char c_2;
}padding_5;

int main(int argc, char **argv) {
	char *str1 = "hello";
	char str2[] = "hello";
	char *char_ptr;
	int *int_ptr;

	printf("%s, pointer size:%lu\n", str1, sizeof(str1));
	printf("%s, array size:%lu\n", str2, sizeof(str2));
	printf("char array size:%lu, int pointer size:%lu\n", sizeof(char_ptr),sizeof(int_ptr));

	printf("padding1 packet size:%lu\n",sizeof(padding_1));
	printf("padding2 packet size:%lu\n",sizeof(padding_2));
	printf("padding3 packet size:%lu\n",sizeof(padding_3));
	printf("padding4 packet size:%lu\n",sizeof(padding_4));
	printf("padding5 packet size:%lu\n",sizeof(padding_5));
	
	return 0;
}

// 결과는 
hello, pointer size:8
hello, array size:6
char array size:8, int pointer size:8
padding1 packet size:12
padding2 packet size:6
padding3 packet size:8
padding4 packet size:6
padding5 packet size:24

결과에 대해서 간단히 그림으로 정리해 봤다. 

 

반응형

'Software > Embedded system' 카테고리의 다른 글

Big O complexity 되새김  (0) 2022.10.08
fmt 와 Variadic function 정리  (0) 2022.07.10
IPC Concept  (0) 2022.02.13
C 프로그램 빌드 과정 정리  (0) 2021.08.09
exec() System call concept  (0) 2021.06.27