Typedefs с тонкой настройкой - PullRequest
1 голос
/ 09 января 2020

Атрибуты типа page для g cc, дают очень интересный пример того, как настроить выравнивание на псевдонимах типов:

typedef int more_aligned_int __attribute__ ((aligned (8)));
//                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

В этом примере more_aligned_int имеет другое выравнивание, чем int, что становится очевидным при объявлении массива этих парней:

aligned_int ar[3]; 

output

error: alignment of array elements is greater than element size
       aligned_int ar[3];
                       ^

Стандартная альтернатива C ++ будет alignas и хотя я был поражен, узнав, что вы действительно можете написать:

using aligned_int = int alignas(8);

компиляция выше дает:

warning: attribute ignored [-Wattributes]
         using aligned_int = int alignas(8);
note: an attribute that appertains to a type-specifier is ignored 

, поэтому нет побочного эффекта, и именно поэтому вышеупомянутое Объявление массива выполнено успешно. Время вопроса:

  • Значит, alignas не эквивалентно атрибуту aligned?
  • Есть ли другие отличия?
  • Существует ли стандарт Кстати, для создания таких typedefs (настройки выравнивания) для встроенных типов?

1 Ответ

3 голосов
/ 09 января 2020

Это не одно и то же. Одним из них является расширение G CC, а другим - стандартная языковая функция.

From cppreference.com :

Может применяться спецификатор alignas к объявлению переменной или члена данных класса, не являющегося битовым полем, или его можно применить к объявлению или определению класса / структуры / объединения или перечисления. Его нельзя применить к параметру функции или параметру исключения из предложения catch.

Поэтому стандартная функция не применяется к int.

Расширение делает ( но затем вы падаете вразрез с такими последствиями, что массив не может существовать).

Перечислять все различия между двумя несвязанными функциями, вероятно, бесполезно.

Существует ли стандартный способ , для создания таких typedefs (настройки выравнивания) для встроенных типов?

Вы можете заключить свой встроенный тип в struct:

struct alignas(8) aligned_int
{
    int val;
};

aligned_int ar[3];

Но обратите внимание, что компилирует (предположительно, потому что размер aligned_int изменился соответственно).

...