【发布时间】:2018-05-12 19:21:47
【问题描述】:
更具体地说,从空类继承的类仅包含一个联合,其成员包括基本无数据类的实例,它占用的内存比联合多。为什么会发生这种情况,有什么办法可以避免消耗额外的内存?
以下代码说明了我的问题:
#include <iostream>
class empty_class { };
struct big : public empty_class
{
union
{
int data[3];
empty_class a;
};
};
struct small
{
union
{
int data[3];
empty_class a;
};
};
int main()
{
std::cout << sizeof(empty_class) << std::endl;
std::cout << sizeof(big) << std::endl;
std::cout << sizeof(small) << std::endl;
}
当使用 gcc 版本 7.3.0 编译并使用 -std=c++17 编译时,此代码的输出是:
1
16
12
我希望类 big 和 small 应该具有相同的大小;然而奇怪的是,big 比 small 占用更多的内存,尽管它们似乎都包含相同的数据。
同样即使union中数组的大小发生变化,big和small的大小之差也是恒定的4个字节。
-编辑:
似乎这种行为并非特定于具有联合数据类型的类。类似的行为发生在派生类具有基类类型的成员的其他类似情况下。感谢指出这一点的人。
【问题讨论】:
-
这与工会无关。
标签: c++ class inheritance sizeof