2013-09-24 4 views
8

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

Я думаю, что '#pragma пак' навсегда будет непереносимой расширение. Некоторые архитектуры не поддерживают неприглаженные обращения к памяти. –

ответ

10

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

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

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

The combined effect of all alignment-specifiers in a declaration shall not specify an alignment that is less strict than the alignment that would be required for the entity being declared if all alignment-specifiers were omitted (including those in other declarations).

Смежные вопросы