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