this question에서 노동 조합의 정렬은 개인 구성원 중 가장 큰 정렬보다 적지 않다고 생각하기 시작할 수 있습니다. 하지만 gcc/g ++의 long long
유형에 문제가 있습니다. 전체 예제는 here를 찾았지만, 여기에 관련된 내 질문에 대한 부분입니다 수 있습니다왜 긴 long 유니온 멤버의 정렬이 포함 된 유니온/struct보다 큰가? 이 올바른지?
sizeof(long long): 8
__alignof__(long long): 8
sizeof(ull): 8
__alignof__(ull): 4
sizeof(sll): 8
__alignof__(sll): 4
왜보다 더 큰 조합원의 정렬입니다 : 이것은 다음과 같은 출력 결과
union ull {
long long m;
};
struct sll {
long long m;
};
int main() {
#define pr(v) cout << #v ": " << (v) << endl
pr(sizeof(long long));
pr(__alignof__(long long));
pr(sizeof(ull));
pr(__alignof__(ull));
pr(sizeof(sll));
pr(__alignof__(sll));
};
포함 노조의 alignof 키스의 대답 에 따르면
[업데이트]
여기에 잘못된 것입니다. 그러나 나는 다음을 시험해 본다. alignof는 우리에게 사실을 말해 준다. 참조 :union ull {
long long m;
};
long long a;
char b;
long long c;
char d;
ull e;
int main() {
#define pr(v) cout << #v ": " << (v) << endl
pr(size_t((void*)&b));
pr(size_t((void*)&c));
pr(size_t((void*)&d));
pr(size_t((void*)&e));
pr(size_t((void*)&c) - size_t((void*)&b));
pr(size_t((void*)&e) - size_t((void*)&d));
};
출력은 :
size_t((void*)&b): 134523840
size_t((void*)&c): 134523848
size_t((void*)&d): 134523856
size_t((void*)&e): 134523860
size_t((void*)&c) - size_t((void*)&b): 8
size_t((void*)&e) - size_t((void*)&d): 4
그래서, long long
의 정렬은 8과 long long
을 포함하는 노동 조합의 정렬은 글로벌 데이터에서 4입니다. 로컬 범위의 경우 컴파일러가 로컬 데이터를 다시 정렬 할 수 있으므로이 테스트를 수행 할 수 없습니다. 따라서이 트릭이 작동하지 않습니다. 이것에 대해 논평 해 주시겠습니까?
[/ UPDATE]
Red Hat에서는 gcc 4.7.0과 함께 '-m32'와 동일한 것을 보지만'-m64'(모두'8's)와는 같지 않습니다. – BoBTFish
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023 _Alignof (C11)에 해당하는 gcc 버그 링크. –