Я пытаюсь понять, как следует использовать alignas, интересно, может ли это быть заменой для пакета pragma, я пытался проверить его, но не повезло. Использование gcc 4.8.1 (http://ideone.com/04mxpI) Я всегда получаю 8 байтов для ниже STestAlignas, а с пакетом pragma - 5 байт. То, что я хотел бы получить, это сделать return sizeof (STestAlignas) 5. Я попытался запустить этот код на clang 3.3 (http://gcc.godbolt.org/), но у меня получилась ошибка:Как использовать alignas для замены пакета pragma?
!! ошибка: запрошенное выравнивание меньше минимального выравнивания 8 для type 'long' - чуть ниже уровня использования alignas.
Возможно, существует минимальное значение выравнивания для выравнивания?
ниже мой тестовый код:
#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;
}
результаты для GCC 4.8.1:
pragma pack = 5
attribute packed = 5
alignas = 8
Я думаю, что '#pragma пак' навсегда будет непереносимой расширение. Некоторые архитектуры не поддерживают неприглаженные обращения к памяти. –