为什么没有成员变量的C++类会占用空间?

2024-04-21

我发现 MSVC 和 GCC 编译器都为每个类实例分配至少一个字节,即使该类是没有成员变量(或只有静态成员变量)的谓词。下面的代码说明了这一点。

#include <iostream>

class A
{
public:
   bool operator()(int x) const
   {
      return x>0;
   }
};

class B
{
public:
   static int v;
   static bool check(int x)
   {
      return x>0;
   }
};

int B::v = 0;

void test()
{
   A a;
   B b;
   std::cout << "sizeof(A)=" << sizeof(A) << "\n"
             << "sizeof(a)=" << sizeof(a) << "\n"
             << "sizeof(B)=" << sizeof(B) << "\n"
             << "sizeof(b)=" << sizeof(b) << "\n";
}

int main()
{
   test();
   return 0;
}

Output:

sizeof(A)=1
sizeof(a)=1
sizeof(B)=1
sizeof(b)=1

我的问题是为什么编译器需要它?我能想到的唯一原因是确保所有成员 var 指针都不同,这样我们就可以通过比较 A 或 B 类型的两个成员的指针来区分它们。但在处理小尺寸容器时,这样做的成本相当严重。考虑到可能的数据对齐,我们可以在没有变量的情况下为每个类获取最多 16 个字节(?!)。假设我们有一个自定义容器,通常会保存一些 int 值。然后考虑这样的容器数组(大约有 1000000 个成员)。开销将是16*1000000!可能发生这种情况的典型情况是容器类的成员变量中存储了比较谓词。另外,考虑到类实例应该总是占用一些空间,调用 A()(value) 时应该预期什么类型的开销?


有必要满足 C++ 标准的一个不变量:相同类型的每个 C++ 对象都需要有一个唯一的地址才能识别。

如果对象不占用空间,则数组中的项目将共享相同的地址。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么没有成员变量的C++类会占用空间? 的相关文章

随机推荐