2012-02-12 2 views
2

struct은 항상 해당 구조체의 가장 큰 정렬 멤버로 정렬되어 있습니까? 그렇지 않은 경우 gcc 관련 확장을 사용하여 자동으로 어떻게 적용 할 수 있습니까? (나는 __attribute((aligned(...)))__을 알고 있지만, 정렬은 명시 적으로 지정되어야한다).구조체와 정렬 된 멤버의 C++ 정렬

이 동작은 c99, C++ 99 및 C++ 11간에 차이가 있습니까? C++ 11에는 정렬 적용을위한 몇 가지 추가 조항이 있습니까?

예 : 다음 코드와 , Foo 것 자체가 자동으로 8 바이트 정렬, 아니면 명시 적으로뿐만 아니라 그것을 정렬해야 할 수?

struct Foo{ 
    int i __attribute__((aligned(8))); 
}; 
+0

정확히 묻는 이유는 무엇입니까? –

+0

@Basile : 예제를 추가했습니다. – eudoxos

+0

복합 유형의 정렬은 실제로 가장 큰 구성원의 정렬입니다. 이러한 유형의 배열을 생각해보십시오! –

답변

1

정렬은 시스템 및 프로세서 특정 속성입니다. 컴파일러는 최선을 다할 수 있으며 프로세서와 시스템의 정렬 제약 조건에 대해 알고 있어야합니다.

대부분의 ABI 사양 (예 : Linux의 경우 AMD64 ABI)에는 몇 가지 맞춤 힌트가 포함되어 있습니다.

정렬 제약 조건이 필드를 포함하는 집계 (예 : struct -s)로 전파된다고 생각합니다.

동적으로 할당 된 데이터에 비정상적인 정렬 제약 조건이있는 경우 정렬을 명시해야 할 수 있습니다. 이를 할당하려면 posix_memalign을 사용하십시오. malloc 및 관련 할당 자 (C++의 ::operator new 포함)는 기본 제약 조건에 필요한 것보다 잘 정렬되지 않습니다.