2013-09-24 2 views
8

나는 alignas가 어떻게 사용되어야하는지 이해하려고 노력하고 있는데, 그것이 pragma pack을 대체 할 수 있는지 궁금해합니다.하지만 그것을 확인하기 위해 열심히 노력했지만 운이 없었습니다. gcc 4.8.1 (http://ideone.com/04mxpI) 사용하기 나는 항상 STestAlignas 이하에서는 8 바이트를, pragma pack에서는 5 바이트를 얻는다. 나는 sizeof (STestAlignas)가 5를 반환하도록하고 싶습니다. 3.3 (http://gcc.godbolt.org/)에이 코드를 실행하려고 시도했지만 오류가 발생했습니다.alignas를 사용하여 pragma pack을 바꾸는 방법은 무엇입니까?

!! 오류 : 요청 된 정렬이 8의 최소 정렬보다 작습니다. alignas 사용 바로 아래에 'long'을 입력하십시오.

그래서 alignas에 대한 최소 정렬 값이 있습니까? GCC 4.8.1에 대한

#include <iostream> 
#include <cstddef> 
using namespace std; 

#pragma pack(1) 
struct STestPragmaPack { 
    char c; 
    long d; 
} datasPP; 
#pragma pack() 

struct STestAttributPacked { 
    char c; 
    long d; 
} __attribute__((packed)) datasAP; 

struct STestAlignas { 
    char c; 
    alignas(char) long d; 
} datasA; 

int main() { 
    cout << "pragma pack = " << sizeof(datasPP) << endl; 
    cout << "attribute packed = " << sizeof(datasAP) << endl; 
    cout << "alignas = " << sizeof(datasA) << endl; 
} 

결과 :

pragma pack = 5 
attribute packed = 5 
alignas = 8 
+0

'의 #pragma 포장 라인 영원히 비 휴대용 확장 될 것입니다. 일부 아키텍처는 정렬되지 않은 메모리 액세스를 지원하지 않습니다. –

답변

10

alignas#pragma pack을 대체 할 수

아래 내 테스트 코드입니다.

GCC는 alignas 선언을 수용하지만, 여전히 회원이 제대로 정렬 유지 : 엄격한 정렬 요구 만족 (이 경우, long의 정렬)도 지정된 요구 사항을 만족시킨다. 표준 실제로 명시 적으로 제 5 항, §7.6.2이 금지로

그러나, GCC는 너무 관대하다 : 나는 생각

The combined effect of all alignment-specifiers in a declaration shall not specify an alignment that is less strict than the alignment that would be required for the entity being declared if all alignment-specifiers were omitted (including those in other declarations).

관련 문제