2013-09-24 10 views
8

Próbuję zrozumieć, w jaki sposób stosować alignaty, zastanawiam się, czy może to być zamiennik pakietu pragma, próbowałem go mocno zweryfikować, ale bez powodzenia. Używając gcc 4.8.1 (http://ideone.com/04mxpI) zawsze otrzymuję 8 bajtów poniżej STestAlignas, podczas gdy pakiet pragma ma 5 bajtów. To, co chciałbym osiągnąć, to przywrócić sizeof (STestAlignas) 5. Próbowałem uruchomić ten kod na klang 3.3 (http://gcc.godbolt.org/), ale dostałem błąd:Jak używać alignas do zastąpienia pakietu pragma?

!! błąd: wymagane wyrównanie jest mniejsze niż minimalne wyrównanie 8 dla wpisz "long" - tuż poniżej użycia alignas.

Być może istnieje minimalna wartość wyrównania dla alignas?

poniżej jest mój kod testowy:

#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; 
} 

wyniki dla gcc 4.8.1:

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

myślę '#pragma opakowaniowe zawsze będzie non-przenośne rozszerzenie. Niektóre architektury nie obsługują niewydzielonych dostępów do pamięci. –

Odpowiedz

10

alignas nie mogą zastąpić #pragma pack.

GCC akceptuje deklarację alignas, ale nadal utrzymuje prawidłowo wyrównany element: spełnienie najostrzejszego wymogu wyrównania (w tym przypadku wyrównanie long) również spełnia określone wymaganie.

Jednak GCC jest zbyt pobłażliwe jako średnia rzeczywiście wyraźnie zabrania tego w §7.6.2 ustęp 5:

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).