为什么C ++中空类的大小不为零?

时间:2010-03-02 09:34:01

标签: c++ sizeof

  

可能重复:
  C++: What is the size of an object of an empty class?

为什么以下输出1

#include <iostream>

class Test
{
};

int main()
{
    std::cout << sizeof(Test);
    return 0;
}

5 个答案:

答案 0 :(得分:109)

标准不允许大小为0的对象(及其类),因为这样可以使两个不同的对象具有相同的内存地址。这就是为什么即使是空类也必须具有(至少)1的大小。

答案 1 :(得分:34)

  

确保两个地址   不同的对象会有所不同。   出于同样的原因,“新”总是如此   返回指向不同对象的指针。

有关完整答案,请参阅Stroustrup

答案 2 :(得分:26)

C ++标准保证任何类的大小至少为1。 C ++标准规定没有对象与另一个对象具有相同的内存地址。这有几个很好的理由。

  1. 保证new始终返回指向不同内存地址的指针。

  2. 避免某些划分为零。例如,指针算术(其中许多由编译器自动完成)涉及除以sizeof(T)

  3. 但请注意,这并不意味着一个空的基类会将1加到派生类的大小上:

    struct Empty { };
    
    struct Optimized : public Empty {
        char c;
    };
    
    // sizeof(Optimized) == 1 with g++ 4.0.1
    

    Bjarne Stroustrup talks about this

答案 3 :(得分:10)

没有任何数据成员和成员函数的类这种类的类称为空类。空类对象的大小总是1个字节。

当我们在那时创建任何类的对象时,对象总是有3个特征,即

  1. 国家
  2. 行为
  3. 身份
  4. 当我们在那个时候创建​​空类的对象时该对象的状态是什么。该对象的行为也没有,但编译器为该对象分配唯一的地址。 计算机中的内存始终以字节的形式组织,对象地址位置可用的最小内存为1个字节。这就是为什么空类对象的大小是1个字节的原因。

答案 4 :(得分:4)

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