假设我有没有数据的类:
struct Empty { /*some methods here*/ };
和派生类
struct Derived: Empty { int a; int b; char c; .... }__attribute__((packed));`
Empty类的对象具有size = 1.派生类的空部分通常具有0大小.据我所知,编译器看到基类Empty类没有数据,因此它可以优化Empty的大小,以防它是"内部"派生但是不需要按标准执行.
所以问题是:
我可以在编译时以某种方式确定Derived类的Empty部分并不真正占用内存.
我知道我可以做的检查,sizeof(Derived) = sizeof(a) + sizeof(b) ...
但它太冗长,有几个类像Derived.有更优雅的解决方案吗?
您可以使用std::is_empty
以确保您继承的类是零大小的:
static_assert(std::is_empty{});
如果是,则保证对标准布局类进行空基优化.
我明白我可以做的检查
sizeof(Derived) = sizeof(a) + sizeof(b) ...
但是它太冗长了.有更优雅的解决方案吗?
这不能正常工作,因为您需要考虑填充和最终属性,例如packed
.