Почему пустая структура весит 1 байт?
struct t1 {};
int s0 = sizeof(t1); // почему 1, а не 0?
Ответы (2 шт):
Потому что два указателя на различные объекты обязаны быть различными.
Если даже что-то может занимать 0 байт, то ему всё равно нужен уникальный адрес, а минимальным адресуемым пространством является байт. Вот и получается, что пустая структура занимает этот байт, хотя никак его не использует.
В С++ один байт (точнее sizeof(char)), в Си (в тех расширениях языка, где резрешены пустые структуры) ноль.
По крайней мере GNU компилятор gcc/g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 для всех стандартов языка Си (-std= c90,gnu90,c99,gnu99,c11,gnu11) разрешает использовать пустую структуру и говорит, что ее размер (sizeof(...)) равен нулю.
Для пустой структуры во всех стандартах C++ (-std= c+98,gnu++98,c++11,gnu++11,c++14,gnu++14,c++1z,gnu++1z) этот же компилятор также разрешет испольковать пустые структуры, но размер такого объекта равен 1.
P.S.
на мой взгляд, такое расхождение это форменное безобразие (для Си), поскольку печатая адреса последовательно определенных переменных с типом такой пустой структуры, вы можете заметить, что реально в памяти под каждую из них отводится 1 байт.
P.P.S
Clang тоже разрешает пустые структуры, для Си размер 0.