可能重复:
C++: What is the size of an object of an empty class?为什么C++中空类的大小不为零?
为什么下面的输出1
?
#include <iostream>
class Test
{
};
int main()
{
std::cout << sizeof(Test);
return 0;
}
可能重复:
C++: What is the size of an object of an empty class?为什么C++中空类的大小不为零?
为什么下面的输出1
?
#include <iostream>
class Test
{
};
int main()
{
std::cout << sizeof(Test);
return 0;
}
的标准不允许大小为0的对象(和类物),因为这将有可能使两个不同的对象具有相同的存储器地址。这就是为什么即使是空类也必须具有(至少)1的大小的原因。
嗯...但不应该连接器能够照顾,无论sizeof()返回什么?这不是更像是一种副作用吗?我明白你在说什么,但是对于sizeof(Test)返回0是不是完全可行的。但是,如果标准这么说,它就是这样说的。事实上,一旦明确而不是故意含糊地描述某个主题,这是一件好事。 – 2010-03-02 10:07:32
@Amigable,那么会测试一个[10];'有大小?而'sizeof a/sizeof * a'会被0除。并且'for(Test * i = a; i!= a + 10; i ++)f(i);'也会失效。我相信这会造成很多问题,因为在编译器*和用户代码中需要很多特殊情况。 – 2010-03-02 12:21:49
@Johannes,如此真实。我没有想到这一点。 – 2010-03-03 13:55:55
为了确保两个不同对象的地址会不同。 出于同样的原因,“新”始终 返回指向不同对象的指针。
请参阅Stroustrup以获得完整答案。
转到直接页面链接 – 2013-03-03 04:12:00
C++标准保证任何类的大小至少为1。 C++标准规定任何对象都不应该具有与另一个对象相同的内存地址。这有几个很好的理由。
为了保证new
将始终返回一个指向不同内存地址的指针。
为了避免零分。例如,指针算术(其中许多是由编译器自动完成的)除以sizeof(T)
。
不过请注意,这并不意味着空基类将增加1至派生类的大小:
struct Empty { };
struct Optimized : public Empty {
char c;
};
// sizeof(Optimized) == 1 with g++ 4.0.1
什么指针算术涉及'sizeof(T)'_dividing_?我想不出一个例子。 Plase添加至少一个示例。 – MSalters 2010-03-02 13:55:52
@ MSalters:遍历T类型元素的数组。 – wilhelmtell 2010-03-02 16:32:55
@MSalters:减去两个指针返回元素之间的数量,而不是字节数。 – 2010-10-11 01:53:59
Maurits和Péter说了些什么。
有趣的是,在这一背景下的编译器可以做的空基类优化(EBCO)注意:
#include <iostream>
struct Foo {};
struct Bar : Foo {};
int main() {
std::cout << sizeof(Foo) << ',' << sizeof(Bar) << std::endl;
}
这可能会打印出“1,1”如果你编译并运行它。请参阅EBCO上的Vandevoorde/Josuttis 16.2。
没有任何数据成员和成员函数的类这种类的类被称为空类。空类对象的大小始终为1个字节。
当我们创建任何类的对象的时候,对象总是获得3个特征,即
当我们在该对象的那个时候国家创建空类的对象是什么。该对象的行为也不算什么,但编译器会为该对象分配一个唯一的地址。 计算机中的内存始终以字节的形式组织,并且对象地址位置处的最小内存为1个字节。这就是为什么空类对象的大小是1字节的原因。
如果任何人想要旋转对象的3个特征,即1)状态2)行为3)身份然后问我 – Shantanu 2011-10-17 08:13:32
有一个虚拟占位符成员,其大小恰好是一个字节。由于对于Test [10]的数组,每个对象都应该有一个唯一的地址。 – legends2k 2010-03-02 10:06:17
一个有趣的优化是'空基优化',这意味着如果你从一个空基类继承(没有属性,没有虚方法),那么你的类的大小将不会增长。有许多(其他)条件,但它解释了为什么在某些情况下私下继承谓词。 – 2010-03-02 15:55:38
[类似问题1](http://stackoverflow.com/questions/1626446)和[类似问题2](http://stackoverflow.com/questions/621616/)。 – Lazer 2010-05-16 06:11:36