Ведь всё работало и было логично и понятно.
Зато когда размер пустой структуры {} и структуры с одним char {char x;} равны - разве это не абсурд?
C/C++
Зачем в С++ размер пустой структуры {} сделали равным 1, ведь в С он был 0?
В каком Си struct был 0? Стандарты этого не гарантировали, было отдано компилятору. Строго говоря struct в Си не описывал тип. Он описывал блок переменных, поэтом нужен был typedef и поэтому существовали анонимные структуры, запрещенные в Си++. Пустота и есть пустота, просто в блоке нет данных.
Есть схожая проблема с "хвостовым" массивом в конце структуры для описания "открытой" структуры. В Си мы могли не указывать размер. В Си++ нужно задать размер 1 (Майкрософт может идти лесом).
В Си++ любой объект имеет минимум 1 байт в размере, как и в Си, и struct стал класс-типом объекта. В новых стандартах появилась гарантия, что "пустые" (т.е. без нестатических членов) класс-типы могут быть поглощены при отсутствии виртульной таблицы.
Есть схожая проблема с "хвостовым" массивом в конце структуры для описания "открытой" структуры. В Си мы могли не указывать размер. В Си++ нужно задать размер 1 (Майкрософт может идти лесом).
В Си++ любой объект имеет минимум 1 байт в размере, как и в Си, и struct стал класс-типом объекта. В новых стандартах появилась гарантия, что "пустые" (т.е. без нестатических членов) класс-типы могут быть поглощены при отсутствии виртульной таблицы.
По идеологии C++ каждый объект должен иметь уникальный адрес. Отсюда этот однобайтный филлер.
При этом, тот же класс или структура, используемая в качестве базового класса, вполне может быть пустым в составе непустого производного класса.
Труп Страуса подтвердит:
https://www.stroustrup.com/bs_faq2.html#sizeof-empty
На практике (onlinegdb) филлеры поглощаются только при наследовании. А композиция... "f..k composition", как бы говорит нам Страуструп.
При этом, тот же класс или структура, используемая в качестве базового класса, вполне может быть пустым в составе непустого производного класса.
Труп Страуса подтвердит:
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, то в массив можно засунуть бесконечное число элементов. Разработчики не захотели уходить в пространство минковского и изобретать варповый двигатель.
Андрей Ходин
в С это было возможным и никому не сносило крышу
интересно, как бы выглядело выделение памяти под "нулевые объекты "и арифметика с указателями на них
Андрей Ходин
надо попробовать и посмотреть
на вскидку: указатели будут одинаковы
на вскидку: указатели будут одинаковы
Ну, конечно же, чтобы сделать жизнь программистов чуточку сложнее и интереснее. Шучу, конечно. Одним из возможных объяснений этого решения может быть желание сделать каждый объект уникальным, даже если он пустой. Также возможно, что это было сделано для обеспечения совместимости с другими языками программирования, в которых размер пустых структур может быть больше нуля. Но в целом, это просто нюанс языка Си, с которым программистам приходится работать.
Похожие вопросы
- Как реализовать программу, в которой массив заполняется рандомно, а сумма его элементов всегда будет равна 1? С++
- Найти решение уравнения(arccos(x-1)+x^3-4=0) на указанном диапазоне ([0.5;1.9]). используя численный метод-Метод Ньютона
- Создать структуры в с++
- [C++] Помогите написать задачу на структуры!
- Программа на c++ не работает. Написать структуру и прочее. Подскажите, пожалуйста, что я делаю не так.
- Учу с++, можете объяснить на пальцах? не понимаю работу условия в теле цикла... if ((i+1)%3 != 0)
- Вложенные структуры. С++
- Создать структуру для описания членов вашей семьи
- Помогите решить задачу на структуры в Си.
- Как правильно запихнуть в поле структуры саму структуру? C++