C/C++

Зачем в С++ размер пустой структуры {} сделали равным 1, ведь в С он был 0?

Ведь всё работало и было логично и понятно.
Зато когда размер пустой структуры {} и структуры с одним char {char x;} равны - разве это не абсурд?
В каком Си struct был 0? Стандарты этого не гарантировали, было отдано компилятору. Строго говоря struct в Си не описывал тип. Он описывал блок переменных, поэтом нужен был typedef и поэтому существовали анонимные структуры, запрещенные в Си++. Пустота и есть пустота, просто в блоке нет данных.

Есть схожая проблема с "хвостовым" массивом в конце структуры для описания "открытой" структуры. В Си мы могли не указывать размер. В Си++ нужно задать размер 1 (Майкрософт может идти лесом).

В Си++ любой объект имеет минимум 1 байт в размере, как и в Си, и struct стал класс-типом объекта. В новых стандартах появилась гарантия, что "пустые" (т.е. без нестатических членов) класс-типы могут быть поглощены при отсутствии виртульной таблицы.
Димитри Евреинов
Димитри Евреинов
165
Лучший ответ
По идеологии C++ каждый объект должен иметь уникальный адрес. Отсюда этот однобайтный филлер.
При этом, тот же класс или структура, используемая в качестве базового класса, вполне может быть пустым в составе непустого производного класса.
Труп Страуса подтвердит:
https://www.stroustrup.com/bs_faq2.html#sizeof-empty

На практике (onlinegdb) филлеры поглощаются только при наследовании. А композиция... "f..k composition", как бы говорит нам Страуструп.
 #include 

using namespace std;

class E {};

class DE : E {};

class DM : DE, E {};

class DN : DE {
short c;
};

class DMN : DE, E {
short c;
};

class C {
E e;
};

class CC {
E e;
short c;
};

class CN {
DN dn;
};

int main() {
cout
A B Строго говоря поглощение гарантировано только в новом стандарте и при остуствии виртуальной таблицы в базовом классе (там иначе сразу на размер указателя прирост).
Если размер структуры = 0, то в массив можно засунуть бесконечное число элементов. Разработчики не захотели уходить в пространство минковского и изобретать варповый двигатель.
Андрей Ходин в С это было возможным и никому не сносило крышу
интересно, как бы выглядело выделение памяти под "нулевые объекты "и арифметика с указателями на них
AD
Armstrongg Drive
25 445
Андрей Ходин надо попробовать и посмотреть
на вскидку: указатели будут одинаковы
Ну, конечно же, чтобы сделать жизнь программистов чуточку сложнее и интереснее. Шучу, конечно. Одним из возможных объяснений этого решения может быть желание сделать каждый объект уникальным, даже если он пустой. Также возможно, что это было сделано для обеспечения совместимости с другими языками программирования, в которых размер пустых структур может быть больше нуля. Но в целом, это просто нюанс языка Си, с которым программистам приходится работать.