派生类中基类的大小
Size of base class inside derived class
假设我有没有数据的类:
struct Empty {
/*some methods here*/
};
和一个派生类
struct Derived: Empty {
int a;
int b;
char c;
....
}__attribute__((packed));`
空类的对象的大小 = 1。派生类的空部分通常具有 0 大小。据我了解,编译器看到基空类没有数据,因此它可以优化空的大小,以防它"在"派生内部",但标准不需要这样做。
所以问题是:
我可以在编译时以某种方式确定派生类的空部分并没有真正占用内存。
我知道我可以像sizeof(Derived) = sizeof(a) + sizeof(b) ...
一样进行检查,但它太冗长了,并且有几个类像派生。还有更优雅的解决方案吗?
您可以使用
std::is_empty
来确保从中继承的类的大小为零:
static_assert(std::is_empty<Empty>{});
如果是,则保证对标准布局类进行空基优化。
我知道我可以像
sizeof(Derived) = sizeof(a) + sizeof(b) ...
一样做检查,但它太啰嗦了。还有更优雅的解决方案吗?
这无法正常工作,因为您需要考虑填充和最终属性,例如 packed
.
您可以使用更多"旧"(在 C++11 之前)宏 - 偏移量:
struct Empty {};
struct NonEmpty {
int a;
};
struct Derived1: Empty {
int a;
int b;
char c;
};
struct Derived2: NonEmpty {
int a;
int b;
char c;
};
static_assert(offsetof(Derived1,a) == 0,"");
static_assert(offsetof(Derived2,a) != 0,"");
您也可以使用此宏来检查成员变量的顺序:
static_assert(offsetof(Derived,a) < offsetof(Derived,b),"");
static_assert(offsetof(Derived,b) < offsetof(Derived,c),"");
但不要忘记 - 偏移量具有相同的限制:
如果类型不是标准布局类型,则行为未定义。 如果成员是静态成员或成员函数,则行为未定义。
相关文章:
- 指向基类派生类的 std::unique_ptr 的指针
- 从多个模板化基类派生时出现"隐藏重载的虚函数"警告
- 从模板基类派生是否在派生类声明的点实例化模板
- 使从一个基类派生的类能够使用继承的受保护成员
- C++多态性访问基类派生类字段
- C++派生类的设置属性到从同一基类派生的未知类对象
- 使用void* 参数定义纯虚函数的抽象基类.派生类匹配参数是指向某种类型的指针
- 在C++中,如何使用将保存从基类派生的任何对象的类成员
- 如何测试从依赖于外部系统的外部基类派生的类
- 如何从模板基类派生非模板类
- 在派生类中使用声明并不能隐藏从基类派生的相同函数
- 从具有静态结构的基类派生
- 具有从 c++ 中的非模板基类派生的模板类的事件系统
- C++ 调用从基类派生的覆盖函数
- 不清楚如何在从抽象基类派生的类中实现运算符重载
- 如何正向声明从正向声明的模板基类派生的类
- 是否可以从 std::enable_shared_from_this 和抽象基类派生
- 多态性c++,试图访问从抽象基类派生的类的成员函数
- C++多重继承,基类派生自同一类
- 基类派生类访问-如何