Я пытаюсь понять, как использовать alignas. Интересно, может ли это быть заменой прагматическому пакету? Я очень старался это проверить, но безуспешно. Используя gcc 4.8.1 (http://ideone.com/04mxpIЯ всегда получаю 8 байт для STestAlignas ниже, в то время как с пакетом pragma это 5 байт. То, что я хотел бы добиться, это сделать, чтобы sizeof (STestAlignas) возвращал 5. Я попытался запустить этот код на clang 3.3 (http://gcc.godbolt.org/) но я получил ошибку:
!!ошибка: запрошенное выравнивание меньше, чем минимальное выравнивание в 8 для типа ‘long’ — чуть ниже использования alignas.
Так может быть, есть минимальное значение выравнивания для 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
alignas
не может заменить #pragma pack
,
GCC принимает alignas
объявление, но по-прежнему сохраняет член должным образом выровненным: удовлетворяя самым строгим требованиям выравнивания (в этом случае выравнивание long
) также удовлетворяет указанному вами требованию.
Однако GCC слишком мягок, так как стандарт на самом деле прямо запрещает это в §7.6.2, параграф 5:
Совокупный эффект всего Выравнивание-спецификаторы в объявлении не должно указываться выравнивание, которое является менее строгим, чем выравнивание, которое потребуется для объявляемого объекта, если все Выравнивание-спецификаторы были опущены (в том числе в других декларациях).
Других решений пока нет …