C언어에서 구조체에 대한 메모리 align은 어떻게 해야 하나요?
글쓴이: chocokeki / 작성시간: 금, 2022/04/22 - 9:10오후
32bit 자료형에 대한 pointer는 대상의 메모리 주소가 32bit align 되어 있어야 하고
16bit 자료형은 주소가 16bit로 align 되어 있어야 하고...그렇다면 궁금한 부분이 생겼습니다
15바이트 크기 struct가 있다고 가정한다면 이놈의 memory align은 어떻게 되어 있어야 할까요?
왜 이런 문의를 드리냐면 바이트 자료형의 버퍼를 크게 잡아둔 다음 여러 타입의 구조체가 공용으로 해당 버퍼를 같이 사용하는데요 align에 의한 문제가 발생하지 않도록 하려 합니다
그간 생각 없이 당연히 되겠지 하고 사용했는데 코딩룰 검사 돌려보니 왜 byte배열을 struct로 type casting 해서 쓰냐고 경고 떠서 진짜 이론적으로도 문제가 없는지 확인하는 중입니다
(사용 중인 chip은 unaligned access를 하면 fault가 발생합니다)
struct의 각 멤버의 address가 각 멤버의 data type 크기에 해당하는 align이 모두 맞아야 문제가 없을 것 같은데 괜히 복잡하게 생각하는건지 아닌지 모르겠습니다
typedef struct { 대충 15B 크기 } data1_t; typedef struct { 대충 17B 크기 } data2_t; uint8_t buffer[2048]; data1_t *d1ptr = (data1_t*)buffer; //pointer를 casting 해서 사용 data2_t *d2ptr = (data2_t*)buffer; //pointer를 casting 해서 사용
Forums:
뭔가 따로 이상한 짓을 하지 않는 한 struct
뭔가 따로 이상한 짓을 하지 않는 한
struct
내부에는 모든 필드가 정렬 조건을 만족하도록 padding이 들어 갑니다.buffer
는max_align_t
와 같은 정렬 조건을 주면 되겠죠.댓글 달기