Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- C
- C언어
- JavaScript
- Algospot
- 백준
- String
- programmers
- Python
- 따라하면서 배우는 C언어
- 인프런
- BFS
- BOJ
- udemy
- BASIC
- DP
- dfs
- sorting
- server
- 종만북
- web
- graph
- 정수론
- 따배씨
- greedy
- Math
- php
- Algorithm
- Cleancode
- 생활코딩
- 따라하며 배우는 C언어
Archives
- Today
- Total
몽상실현개발주의
[따배씨] 14.4 구조체의 메모리 할당 본문
따배씨 - 따라하며 배우는 C언어
14강 구조체_1
14.4 구조체의 메모리 할당 Memory Allocation
#include <stdio.h>
#include <stdlib.h>
int main()
{
/*
Well aligned structure
*/
struct Aligned
{
int a;
float b;
double c;
};
// structure 를 선언한는 것으로 메모리를 차지 하지 않음
/*
0 1 2 3 4 5 6 7|8 9 10 11 12 13 14 15|
|int a |float b|double c
4 + 4 + 8 = 16
*/
struct Aligned a1, a2;
// 구조체 변수들이 만들어 질 때, 메모리가 할당 됨
printf("struct Aligned a1\n");
// struct Aligned a1
printf("Sizeof %zd\n", sizeof(struct Aligned));
// Sizeof 16
printf("%lld\n", (long long)&a1);
// 140732920755328
printf("%lld\n", (long long)&a1.a);
// 140732920755328
printf("%lld\n", (long long)&a1.b);
// 140732920755332
printf("%lld\n", (long long)&a1.c);
// 140732920755336
printf("struct Aligned a2\n");
// struct Aligned a2
printf("Sizeof %zd\n", sizeof(a2));
// Sizeof 16
printf("%lld\n", (long long)&a2);
// 140732920755312
printf("%lld\n", (long long)&a2.a);
// 140732920755312
printf("%lld\n", (long long)&a2.b);
// 140732920755316
printf("%lld\n", (long long)&a2.c);
// 140732920755320
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
/*
padding (struct member alignment)
- 1 word: 4 bytes in x86, 8 byte in x64
메모리와 cpu가 데이터를 주고 받는 최소 단위
*/
struct Padded1
{
char a;
float b;
double c;
};
/*
Without padding
0 1 2 3 4 5 6 7|8 9 10 11 12 13 14 15|16
|a|float b|double c | ? ? ?
1 + 4 + 8 = 13
*/
/*
With padding
0 1 2 3 4 5 6 7|8 9 10 11 12 13 14 15|16
|char a |float b|double c |
4(char?) + 4 + 8 = 16
1 word 단위에 맞추어, compiler 가 3byte padding 을 넣어줌
*/
struct Padded1 p1;
printf("struct Padded p1\n");
// struct Padded p1
printf("Sizeof %zd\n", sizeof(p1));
// Sizeof 16
printf("%lld\n", (long long)&p1);
// 140732920755048
printf("%lld\n", (long long)&p1.a);
// // 140732920755048
printf("%lld\n", (long long)&p1.b);
// 140732920755052
printf("%lld\n", (long long)&p1.c);
// 140732920755056
struct Padded2
{
float a;
double b;
char c;
};
/*
|0 1 2 3 4 5 6 7|8 9 10 11 12 13 14 15|16 17 18 19 20 21 22 23|24
|float a |double b |char c |
8(float ?) + 8 + 8(char ?) = 24
compiler 가 double 8byte 자르지 않기 위하여 float 과 char 에 padding 을 넣어 줌
*/
struct Padded2 p2;
printf("struct Padded p2\n");
// struct Padded p2
printf("Sizeof %zd\n", sizeof(p2));
// Sizeof 24
printf("%lld\n", (long long)&p2);
// 140732920755024
printf("%lld\n", (long long)&p2.a);
// // 140732920755024
printf("%lld\n", (long long)&p2.b);
// 140732920755032
printf("%lld\n", (long long)&p2.c);
// 140732920755040
struct Padded3
{
char a;
double b;
double c;
};
/*
|0 1 2 3 4 5 6 7|8 9 10 11 12 13 14 15|16 17 18 19 20 21 22 23|24
| char a | double b | double c |
8(char ?) + 8 + 8 = 24
*/
struct Padded3 p3;
printf("struct Padded p3\n");
// struct Padded p3
printf("Sizeof %zd\n", sizeof(p3));
// Sizeof 24
printf("%lld\n", (long long)&p3);
// 140732920755000
printf("%lld\n", (long long)&p3.a);
// 140732920755000
printf("%lld\n", (long long)&p3.b);
// 140732920755008
printf("%lld\n", (long long)&p3.c);
// 140732920755016
struct Person
{
char name[41]; //member
int age; //member
float height; //member
};
struct Person mommy;
printf("struct Person\n");
// struct Person
printf("%lld\n", (long long)&mommy.name[0]);
// 140732920755280
printf("%lld\n", (long long)&mommy.age);
// 140732920755324
printf("%lld\n", (long long)&mommy.height);
// 140732920755328
printf("Sizeof %zd\n", sizeof(mommy)); // 41 + 4 + 4 = 49 ?
// Sizeof 52
struct Person f[4];
printf("Sizeof a structure array %zd\n", sizeof(f));
// Sizeof a structure array 208
/*
|f[0].name |f[0].age | f[0].height | ... |f[3].name |f[3].age |f[3].height |
*/
return 0;
}
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
http://blog.naver.com/atelierjpro
http://www.inflearn.com/course/following-c
'Language > C' 카테고리의 다른 글
[따배씨] 14.8 구조체와 함수 연습문제 (0) | 2021.06.22 |
---|---|
[따배씨] 14.4 구조체의 배열 연습 문제 (0) | 2021.06.22 |
[따배씨] 14.2 구조체의 기본적인 사용법 (0) | 2021.06.22 |
[따배씨] 14.1 구조체가 필요한 이유 (0) | 2021.06.22 |
[따배씨] 13.8 텍스트 파일을 바이너리 처럼 읽어보기 (0) | 2021.06.18 |
Comments