2009-08-31 4 views
0

나는 구조 정렬 '구현 특정'이해하지만, 예를 들어, 구조의 정렬을 계산할 수있는 간단한 방법이 있는지 궁금 :간단한 방법 (매크로?)을 사용하면 구조체 정렬을 알 수 있습니까?

typedef struct 
{ 
    char c; 
    int i; 
} test; 

if sizeof(test) - (sizeof(char) + sizeof(int)) == 0 means alignment is 1 byte; 
if sizeof(test) - (sizeof(char) + sizeof(int)) == 1 means alignment is 2 bytes; 
// ...etc... 

위의 가정을 안정적으로 사실인가요가? 당신이 원하는 모든 좋은 첫번째 추측 인 경우

답변

0

, 다음 중간 적 구조에서 가장 큰 비 집계 멤버의 최대 크기와

4

귀하의 방법은 일반적인 경우에 신뢰할 수 없습니다 중첩 된 구조를 찾을 수 있습니다 : 당신이 경우 이 구조체에 그것을 시도 :

typedef struct 
{ 
    int i1; 
    int i2; 
} test; 

당신은 아마 정렬하지 않은 결과로 제로 줄 것입니다. 여기

하지만, 작동하는 방법이다 :

#include <stddef.h> 

struct dummy 
{ 
    char x; 
    test t; 
}; 

size_t test_alignment = offsetof(struct dummy, t); 
+0

#INCLUDE 구조체 더미 { 숯 X; int i; }; size_t test_alignment = offsetof (struct dummy, i); 위 작업을 수행 할 수 있습니까? –

+0

"작품"이 의미하는 바에 달려 있습니다. test_alignment를'struct dummy' 내부에'i'의 정렬로 설정합니다. 그것이 당신이 원하는 것을 원한다면, 확실히 작동합니다. –

+0

그러면'int' 타입의 정렬을 테스트 할 것입니다. (정의 된 타입'test'의 정렬을 테스트하기를 원한다고 생각합니까?) – caf

1

을 그리고 여기 유형의 정렬 얻을 내 도구 상자에있는 매크로 (caf's technique 사용)입니다 : 그래서 지금

#define ALIGNMENT_OF(t) offsetof(struct { char x; t dummy; }, dummy) 

typedef struct 
{ 
    char c; 
    int i; 
} test; 

size_t x = ALIGNMENT_OF(test); // will likely set x = 4 

특정 컴파일러는 다음과 같은 표현식을 사용할 수 있습니다. (예 : MSVC가 __alignof() 내장을 지원하기 시작한 경우). 내 머리글 ALIGNMENT_OF() 그것을 정의하는 컴파일러를 감지하는 경우 해당 내장 함수를 사용하여 정의합니다 (비록 솔직히 내재적으로 어떤 이점을 제공하는지 알지 못함).

+0

내가 잘못하지 않는다면 매크로는'offsetof'가 필요하지 않기 때문에 정의되지 않은 동작을합니다 그런 식의 인수로 전달 된 익명 구조체에 대한 작업. 매크로 체내에서'offsetof'의 이식성있는 정의를 직접 써서 고칠 수 있습니다. –

관련 문제