Оператор alignof
Оператор alignof возвращает требуемое выравнивание типа в байтах. Он принимает один параметр - тип, для которого нужно получить значение выравнивания. Оператор возвращает значение типа size_t, которое показывает, на сколько байт должно быть выровнено начало объекта данного типа в памяти.
Оператор alignof работает во время компиляции и может быть применён как к фундаментальным типам, так и к пользовательским структурам и классам. Знание выравнивания полезно при работе с низкоуровневой памятью, при выравнивании указателей и в оптимизациях производительности.
Синтаксис
alignof(type)
Пример
Давайте выведем выравнивание для нескольких фундаментальных типов:
#include <iostream>
using namespace std;
int main()
{
cout << alignof(char) << endl;
cout << alignof(int) << endl;
cout << alignof(double) << endl;
return 0;
}
Результат выполнения кода:
1
4
8
Пример
Давайте выведем выравнивание для пользовательской структуры и сравним его с выравниванием её полей:
#include <iostream>
using namespace std;
struct MyStruct
{
char a;
int b;
double c;
};
int main()
{
cout << alignof(MyStruct) << endl;
cout << alignof(char) << endl;
cout << alignof(int) << endl;
cout << alignof(double) << endl;
return 0;
}
Результат выполнения кода:
8
1
4
8
Выравнивание структуры равно максимальному выравниванию среди её полей, в данном случае 8 байт из-за поля типа double.
Пример
Давайте используем alignof вместе с alignas для управления выравниванием переменной:
#include <iostream>
using namespace std;
struct alignas(16) AlignedStruct
{
int x;
};
int main()
{
cout << alignof(AlignedStruct) << endl;
cout << sizeof(AlignedStruct) << endl;
return 0;
}
Результат выполнения кода:
16
16