몽상실현개발주의

[따배씨] 15.12 메모리 줄맞춤 alignof, alignas 본문

Language/C

[따배씨] 15.12 메모리 줄맞춤 alignof, alignas

migrationArc 2021. 7. 29. 22:17

[따배씨] 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

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

 

Comments