Language/C
[따배씨] 15.12 메모리 줄맞춤 alignof, alignas
migrationArc
2021. 7. 29. 22:17
따배씨 - 따라하며 배우는 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
실리콘 밸리의 프로그래머 : 네이버 블로그
안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.
blog.naver.com
http://www.inflearn.com/course/following-c
홍정모의 따라하며 배우는 C언어 - 인프런 | 강의
'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원
www.inflearn.com