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
- BASIC
- C언어
- DP
- BOJ
- 인프런
- udemy
- 종만북
- Python
- programmers
- C
- graph
- Cleancode
- 백준
- JavaScript
- 정수론
- php
- Math
- 따라하며 배우는 C언어
- Algorithm
- server
- String
- 따배씨
- 따라하면서 배우는 C언어
- Algospot
- 생활코딩
- web
- BFS
- greedy
- sorting
- dfs
Archives
- Today
- Total
몽상실현개발주의
[따배씨] 15.12 메모리 줄맞춤 alignof, alignas 본문
따배씨 - 따라하며 배우는 C언어
15강 비트 다루기
15.12 메모리 줄맞춤 alignof, alignas
- 변수나 배열같은 객체들을 메모리에 배치 할때, 줄맞춤 규칙을 결정
#include <stdio.h>
#include <stdalign.h>
int main()
{
printf("Alignment of char = %zu\n", alignof(char));
// Alignment of char = 1
// align 의 size 가 1 byte 이므로, align 을 할 때 최소 단위가 1byte
printf("alignof(float[10]) = %zu\n", alignof(float[10]));
// alignof(float[10]) = 4
// float 의 size 가 4 byte 이므로, align 시 최소 단위가 4byte
printf("alignof(struct{char c; int n;} = %zu\n", alignof(struct{char c; int n;}));
// alignof(struct{char c; int n;} = 4
// 구조체의 멤버 중 가장 큰 단위가 int size 4 byte 이므로, align 시 최소 단위가 4 byte
double dx;
char ca;
char cx;
double dz;
char cb;
char cz;
// char alignas(double) cz; // align 방법을 double size 기준으로 변경
// char alignas(16) cz; // align 방법을 16 byte 기준으로 변경
printf("char alignment: %zd\n", alignof(char));
// char alignment: 1
printf("double alignment: %zd\n", alignof(double));
// double alignment: 8
printf("&dx: %p %lld\n", &dx, (long long)&dx % 8);
// &dx: 0x7ffeefbff480 0
printf("&ca: %p %lld\n", &ca, (long long)&ca % 8);
// &ca: 0x7ffeefbff47f 7
printf("&cx: %p %lld\n", &cx, (long long)&cx % 8);
// &cx: 0x7ffeefbff47e 6
printf("&dz: %p %lld\n", &dz, (long long)&dz % 8);
// &dz: 0x7ffeefbff470 0
printf("&cb: %p %lld\n", &cb, (long long)&cb % 8);
// &cb: 0x7ffeefbff46f 7
printf("&cz: %p %lld\n", &cz, (long long)&cz % 8);
// &cz: 0x7ffeefbff46e 6 - char cz;
// &cz: 0x7ffeefbff468 0 - char alignas(double) cz;
// &cz: 0x7ffeefbff460 0 - char alignas(16) cz;
return 0;
}
컴퓨터 메모리에서 데이터가 정렬되고 액세스되는 방식을 나타냅니다.
데이터 정렬, 데이터 구조 패딩(padding), 패킹(packing) 과 같은 세 가지 개별적인 관련 문제로 구성됩니다.
최신 컴퓨터 하드웨어의 CPU는 데이터가 자연스럽게 정렬 (naturally aligned) 될 때(일반적으로 데이터 주소가 데이터 사이즈의 배수일 때) 메모리에 대한 읽기 및 쓰기를 가장 효율적으로 수행할 수 있습니다.
데이터 얼라인먼트는 정렬되는 요소가 자연 정렬(natural alignment) 을 따르는 것을 의미합니다.
자연 정렬(natural alignment) 을 보장하기 위해 구조 요소(structure elemetns) 사이에 또는 구조의 마지막 요소(the last element of a structure) 뒤에 패딩(padding)을 삽입해야 합니다.
데이터 구조 정렬은 모든 최신 컴퓨터에서 근본적인 문제이지만 만은 컴퓨터 언어 및 컴퓨터 언어 구현(implementation)이 데이터 정렬을 자동으로 처리합니다.
Ada, PL/I, Pascal, 특정 C 및 C++ 구현, D, Rust, C#, 그리고 어셈블리는 최소한 데이터 구조체 패딩(data streucture padding)의 부분적인 제어를 허용하며, 이것은 특정 상황에서 유용할 수 있습니다.
//출처: https://minusi.tistory.com/entry/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%96%BC%EB%9D%BC%EC%9D%B8%EB%A8%BC%ED%8A%B8Memory-Alignment
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
http://blog.naver.com/atelierjpro
http://www.inflearn.com/course/following-c
'Language > C' 카테고리의 다른 글
[따배씨] 16.2 전처리기를 준비하는 번역 단계 (0) | 2021.08.04 |
---|---|
[따배씨] 16.1 전처리기가 해주는 일들 (0) | 2021.08.03 |
[따배씨] 15.11 비트필드의 패딩 (0) | 2021.07.29 |
[따배씨] 15.10 비트필드의 사용방법 (0) | 2021.07.27 |
[따배씨] 15.9 구조체 안의 비트필드 (0) | 2021.07.27 |
Comments