C ++:空类的对象的大小是多少?

我想知道什么是一个空的类的对象大小 。 它肯定不能是0字节,因为它应该可以像任何其他对象一样引用和指向它。 但是,这样的对象有多大?

我用这个小程序:

#include <iostream> using namespace std; class Empty {}; int main() { Empty e; cerr << sizeof(e) << endl; return 0; } 

我在Visual C ++和Cygwin-g ++编译器上得到的输出是1个字节 ! 这对我来说有点令人惊讶,因为我期待它是机器字(32位或4字节)的大小。

任何人都可以解释为什么 1字节的大小? 为什么不是 4个字节? 这是依赖于编译器还是机器呢? 另外,有人可以给出一个更强有力的理由,为什么一个空的类对象不会是大小为0字节?

引用Bjarne Stroustrup的C ++风格和技巧常见问题 ,大小不为零的原因是“为了确保两个不同的对象的地址是不同的。 大小可以是1,因为在这里没有关系,因为没有什么可以看的。

该标准规定所有大多数派生的对象都有sizeof()> = 1:

除非是位域(class.bit),否则大多数派生对象的大小应该是非零的,并占用一个或多个字节的存储空间。 基类子对象可能具有零大小。 ISO / IEC FDIS 14882:1998(E)intro.object

这实际上是一个实现细节。 很久以前,我认为它可能是零字节或一千个字节,它不影响语言规范。 但是,在看了标准之后(5.3.3节), sizeof被定义为总是返回一个或者更多,不管怎样。

大多数派生类的大小应该大于零。

除此之外,这是必需的,允许您处理对象的数组和指针。 如果你的元素被允许为零,那么&(array[0])&(array[42]) ,这会给你的处理循环带来种种的破坏。

它可能不是一个机器词的原因是它内部没有任何元素实际上要求它在一个字边界(比如一个整数)上对齐。 例如,如果你放置char x; int y; char x; int y; 在课堂上,我的GCC以8字节的时钟(因为第二个int必须在那个实现中对齐)。

有一个例外:0长度的数组

 #include <iostream> class CompletlyEmpty { char NO_DATA[0]; }; int main(int argc, const char** argv) { std::cout << sizeof(CompletlyEmpty) << '\n'; } 

尽管不需要为空类分配任何内存,但为了创建空类的对象,编译器会分配可分配的最小内存,即1个字节。 这样编译器可以唯一地区分同一个空类的两个对象,并且可以将对象的地址赋给空类类型的指针。

我认为链接到一个解释这个好的答案也许是有帮助的。 这是由Logan Capaldo提供的 boost::compressed_pair

这可能有助于你:-) http://bytes.com/topic/c/insights/660463-sizeof-empty-class-structure-1-a

空的类或结构的大小是1

发生这种情况的原因归结为正确实施标准,C ++标准所说的一个事实是“没有任何对象的内存地址与其他变量的内存地址相同”。……确保这一点最简单的方法是什么? 确保所有类型都具有非零大小。 为了达到这个目的,编译器将一个空字节添加到没有数据成员和没有虚函数的结构和类中,使它们的大小为1而不是大小为0,然后保证它们具有唯一的内存地址。

为一个空的类分配1个字节是依赖于编译器的。 编译器需要确保对象驻留在不同的内存位置,并且需要为对象分配非零内存大小。 在这里听这个话题的笔记: http : //listenvoice.com/listenVoiceNote.aspx?id=27

即使编译器为空类分配非零大小,当从空类中派生新类时,它们也会进行优化。 听听ListenVoice的c ++编程面试问题的空基优化。

没有数据成员但是大小为1字节的类的原因是这个* 强文本 *必须存储在内存中,以便引用或指针可以指向该类的对象

空的类 – 这个类不包含任何内容。

任何不为空的类将由其内容表示。

现在如何在内存中表示空的类? 因为它没有内容无法显示其存在的存在,但阶级是存在的,它是强制性的,以显示它的存在。 要显示内存中空的类1个字节是必需的。

我认为这是因为1字节是可用作占位符的最小内存单位,它不能给零大小,因为它不可能创建一个对象数组。

和你说的话“这对我来说有点令人惊讶,因为我期待它是机器字(32位或4字节)的大小。 对于empty()类型的引用变量(macine words),不是类本身的大小(这是抽象数据类型),

我认为这个问题只是理论上的兴趣,但在实践中并不重要。

正如其他人已经指出的那样,从一个空类派生不会造成任何伤害,因为这不会为基类部分消耗任何额外的内存。

而且,如果一个类是空的(意味着它在理论上不需要任何实例内存,即它没有任何非静态数据成员或虚拟成员函数),那么它的所有成员函数也可以(而且应该)被定义为静态的。 所以不需要创建这个类的一个实例。

底线:如果你发现自己写了一个空的类X,那么只是使所有的成员函数静态。 那么你不需要创建X对象,派生类也不会受到任何影响。

 #include<iostream> using namespace std; class Empty { }; int main() { Empty* e1 = new Empty; Empty* e2 = new Empty; if (e1 == e2) cout << "Alas same address of two objects" << endl; else cout << "Okay it's Fine to have different addresses" << endl; return 0; } 

输出:好的,可以有不同的地址

返回大小1确保两个对象不会有相同的地址。

确保两个不同的对象具有不同的地址是非零的。 不同的对象应该有不同的地址,所以空的类的大小总是1个字节。

我认为,如果一个空的类的大小为零,这意味着它不存在。 对于它(类)的存在,它需要至少有1个字节,因为这个字节是内存/引用地址。

正是由于这个指针,尽管指针是4个字节的(整数),但是指的是1个字节的一个存储单元(一个单元)。