Я пытаюсь понять, как использовать alignas. Интересно, может ли это быть заменой прагматического пакета? Я очень старался это проверить, но безуспешно. Используя gcc 4.8.1 (http://ideone.com/04mxpI), я всегда получаю 8 байтов для STestAlignas ниже, тогда как с пакетом прагмы это 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
[26.08.2019]
Похоже, что в этой теме есть движение за стандартизацию. Предложение p1112 - Языковая поддержка для управления макетом класса - предлагает добавить (среди прочего) атрибут [[layout(smallest)]]
, который должен переупорядочивать членов класса, чтобы сделать затраты на выравнивание настолько малыми, насколько это возможно (что является обычной техникой для программистов). - но это часто убивает читаемость определения класса). Но это не равно тому, что делает прагма (пакет)!