Как использовать alignas для замены пакета Pragma?

Я пытаюсь понять, как использовать 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

9

Решение

alignas не может заменить #pragma pack,

GCC принимает alignas объявление, но по-прежнему сохраняет член должным образом выровненным: удовлетворяя самым строгим требованиям выравнивания (в этом случае выравнивание long) также удовлетворяет указанному вами требованию.

Однако GCC слишком мягок, так как стандарт на самом деле прямо запрещает это в §7.6.2, параграф 5:

Совокупный эффект всего Выравнивание-спецификаторы в объявлении не должно указываться выравнивание, которое является менее строгим, чем выравнивание, которое потребуется для объявляемого объекта, если все Выравнивание-спецификаторы были опущены (в том числе в других декларациях).

11

Другие решения

Других решений пока нет …