Оператор alignof возвращает количество байт (тип size_t) требуемых для выравнивания типа данных переданных ему как аргумент. Возвращаемый результат оператора alignof совпадает с размером данного типа в байтах (возвращаемый функцией sizeof ), для char это 1, short - 2, int - 4, double - 8 и т.д.
#include <iostream> // cout, endl
using namespace std;
int main(){
cout << alignof(char) << endl; // 1
cout << alignof(short) << endl; // 2
cout << alignof(int) << endl; // 4
cout << alignof(float) << endl; // 4
cout << alignof(double) << endl; // 8
}
Компилятор не может менять порядок расположения переменных в классах и структурах и выравнивает переменные как правило по границе 4 байта и порядок расположения переменных влияет на выравнивание и размер структур и классов. Пример программы демонстрирующий различный размер вроде бы одинаковых структур приведен ниже.
#include <iostream> // cout, endl
using namespace std;
struct st_align{ // Структура с выравненными данными
double b;
int a;
int c;
};
struct st_not_align{ // Структура с невыравненными данными
int a;
double b;
int c;
};
int main(){
cout << "size st_align = " << sizeof (st_align) << endl; // Выводим размер выравненной структуры 16
cout << "size st_not_align = " << sizeof (st_not_align) << endl; // Выводим размер невыравненной структуры 24
}
/* Вывод программы:
size st_align = 16
size st_not_align = 24
*/