반응형

코드

struct MyStruct {
	int a;
	double b;
	char c;
}A;

union MyUnion
{
	int a;
	double b;
}B;

int main(void) {	
	printf("MyStruct: %d\n", sizeof(A));
	printf("MyUnion: %d\n", sizeof(B));
}

결과화면:

MyStruct: 24
MyUnion: 8

 

 

 

union MyUnion
{
	int a;
	double b;
	char str[31];
}B;

union OuterUnion{
	union InnerUnion
	{
		int a;
		double b;
		char str[31];
	}B;
}C;

int main(void) {
	printf("MyStruct: %d\n", sizeof(C));
	printf("MyUnion: %d\n", sizeof(B));

	return 0;
}

결과화면:

MyStruct: 32
MyUnion: 32

 

 

 

struct {
	int status;
	char a[128];
} b;

int main(void) {
	printf("MyStruct: %d\n", sizeof(b));
	return 0;
}

결과화면:

MyStruct: 132

 

 

typedef struct
{
	int length;
	char buffer[];
}A;

int main(void) {
	A a;
	a.length = 3;
	a.buffer;
	printf("%p: %p \n", &a.length, &a.buffer);
	printf("MyStruct: %d\n", sizeof(A));
}

결과화면:

0073FCC8: 0073FCCC
MyStruct: 4

 

buffer[]사이즈는 0임. 그 이유 : https://stackoverflow.com/questions/15607855/char-buffer-with-zero-length-accomdates-the-integer

 

 

typedef struct
{
	int length;
	char *buffer;
}A;

int main(void) {
	A a;
	a.length = 3;
	a.buffer;
	printf("%p: %p \n", &a.length, &a.buffer);
	printf("MyStruct: %d\n", sizeof(A));
}

결과화면:

0115F8FC: 0115F900
MyStruct: 8

 

 

 

 

struct

- 각 멤버들의 메모리 시작 주소가 다름.
- 가장 큰 변수의 크기 값을 기준으로 잡고, 기준 값의 크기에 나머지 순서대로 배치하여 구조체의 전체 크기가 결정됨.
(long(8), long(8) int(4), char(1), char(1) => 22byte일거 같지만,
long(8), long(8), int2(8), char2(8) 해서 32byte이다.

- 멤버의 순서가, 구조체의 크기에 영향을 줄 수 있음.


union

- 각 멤버들의 시작 주소가 모두 동일.
- 멤버 변수 중 가장 큰 크기의 값을 하나 할당 받고, 모든 멤버가 그 메모리 공유

 

규칙 (메모리 정렬)

- 64비트 시스템에선, int가 4 단위로 시작, long은 8, short은 2단위로 주소가 시작됨.

- char와 char[] (어떠한 메모리 엑세스도 가능)는 특이함, 얘네는 패딩이 필요가 없음.

- struct

 

규칙 (주소 할당)

- (64비트 시스템) n * 16 bytes 배수로 struct크기가 지정됨.

 

 

참고자료

https://stackoverflow.com/questions/4306186/structure-padding-and-packing

 

반응형