C++ 派生类中基类的大小

C++ 派生类中基类的大小,c++,C++,假设我有一个没有数据的类: struct Empty { /*some methods here*/ }; 和派生类 struct Derived: Empty { int a; int b; char c; .... }__attribute__((packed));` 空类的对象的大小为1。派生类的空部分的大小通常为0。据我所知,编译器看到基类Empty并没有数据,所以它可以在“内部”派生的情况下优化Empty的大小,但标准并不要求它这样做 因此,问题是: 我可以在编

假设我有一个没有数据的类:

struct Empty {
  /*some methods here*/
};
和派生类

struct Derived: Empty {
  int a;
  int b;
  char c;
  ....
}__attribute__((packed));`
空类的对象的大小为1。派生类的空部分的大小通常为0。据我所知,编译器看到基类Empty并没有数据,所以它可以在“内部”派生的情况下优化Empty的大小,但标准并不要求它这样做

因此,问题是:

我可以在编译时确定派生类的空部分并没有真正占用内存吗

我知道我可以做一些检查,比如
sizeof(派生)=sizeof(a)+sizeof(b)…
,但是它太冗长了,有几个类类似于派生类。还有更优雅的解决方案吗?

您可以使用它来确保从中继承的类的大小为零:

static_assert(std::is_empty<Empty>{});
static_断言(std::is_empty{});
如果是,就是


我知道我可以做类似于
sizeof(派生)=sizeof(a)+sizeof(b)…
的检查,但它太冗长了。还有更优雅的解决方案吗

这不能正常工作,因为您需要考虑填充和最终属性,例如
packed

您可以在C++11)宏之前使用更多的“old”():

您也可以使用此宏检查成员变量的顺序:

static_assert(offsetof(Derived,a) < offsetof(Derived,b),"");
static_assert(offsetof(Derived,b) < offsetof(Derived,c),"");
static_断言(offsetof(派生,a)
但别忘了,offsetof也有同样的限制:

如果类型不是标准布局类型,则行为未定义。 如果成员是静态成员或成员函数,则行为未定义


谢谢不知道此优化是有保证的。标准不保证此优化。但在实际的编译器中,这是很常见的。@Peter:。我会澄清我的答案。你为什么想知道?请注意,成员或基类可以在不增加派生类的占用空间的情况下占用内存(通过使用填充丢失的空间)。还要注意,结构上的
sizeof
可以小于或大于其成员和基的
sizeof
之和。我将使用这些派生类来表示一些网络数据。所以所有这些派生类都将具有压缩属性。我还将继承一些模板类,以实现奇怪的循环模板模式。这样所有派生类都将具有一些公共功能。但是,我不希望这种继承影响派生类的布局。
static_assert(offsetof(Derived,a) < offsetof(Derived,b),"");
static_assert(offsetof(Derived,b) < offsetof(Derived,c),"");