C++: Каков размер объекта пустого класса?

103
задан Ashwin Nanjappa 7 March 2009 в 10:36
поделиться

6 ответов

Заключая в кавычки Стиль и техника FAQ C++ Bjarne Stroustrup, причина, размер является ненулевым, состоит в том, чтобы "Гарантировать, что адреса двух различных объектов будут отличаться". И размер может быть 1, потому что выравнивание не имеет значения здесь, поскольку нет ничего для фактического взгляда на.

122
ответ дан Lena Schimmel 5 November 2019 в 11:20
поделиться

Это - действительно деталь реализации. Когда-то давно я думал, что это могли быть нулевые байты или тысяча байтов, что это не имеет никакого влияния на спецификацию языка. Но, после рассмотрения стандарта (разделяют 5.3.3), sizeof определяется как всегда возврат того или больше, несмотря ни на что.

, размер большей части производного класса должен быть больше, чем нуль.

Это требуется для, среди прочего, позволяя Вам обработать массивы объектов и указателей на них. Если бы Вашим элементам позволили быть нулевого размера тогда &(array[0]), то было бы идентично &(array[42]), который собирается вызвать все виды опустошения к Вашим циклам обработки.

причина, почему это не может быть машинное слово, состоит в том, что нет никаких элементов в нем, которые на самом деле требуют, чтобы это было выровненное на границе слова (такой как целое число). Например, если Вы помещаете char x; int y; внутренняя часть класс, мой GCC синхронизирует его на уровне восьми байтов (так как второй интервал должен быть выровненный в той реализации).

13
ответ дан paxdiablo 5 November 2019 в 11:20
поделиться

Я думаю, что могло бы быть полезно связаться с ответом, объяснив эту пользу также. Это приблизительно boost::compressed_pair Logan Capaldo .

4
ответ дан Community 5 November 2019 в 11:20
поделиться

В стандарте говорится, что все большинство производных объектов имеет sizeof ()> = 1:

, Если это не битовое поле (class.bit), большая часть производного объекта должна иметь ненулевой размер и должна занять один или несколько байтов устройства хранения данных. Подобъекты базового класса могут иметь нулевой размер. ISO/IEC FDIS 14882:1998 (E) intro.object

30
ответ дан Cheers and hth. - Alf 5 November 2019 в 11:20
поделиться

Выделение 1 байта для пустого класса зависит от компилятора. Компиляторы должны убедиться, что объекты находятся в разных областях памяти, и они должны выделять объекту ненулевой объем памяти. Прослушайте заметки на эту тему здесь: http://listenvoice.com/listenVoiceNote.aspx?id=27

Несмотря на то, что компиляторы выделяют ненулевой размер для пустого класса, они также проводят оптимизацию, когда новые классы получаются из пустых классов. Послушайте об оптимизации пустых баз на интервью ListenVoice's c++ programming interview questions.

2
ответ дан 24 November 2019 в 04:10
поделиться

Это из-за этого указателя, хотя указатель и является (целым числом) из 4 байт, но он ссылается на одну ячейку памяти (одну единицу), которая равна 1 байту.

-3
ответ дан 24 November 2019 в 04:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: