首页 > 解决方案 > 没有任何额外数据成员的派生类的大小

问题描述

当使用 C 库时,从 C 结构派生一个类并添加一些方法以在没有任何数据成员的情况下对其进行操作可能是合适的。你可以添加一个构造函数来更方便地初始化成员。因此,这些对象可能会被隐式向上转换并传递给 C-API。

在某些情况下,API 需要一个 C 结构数组。但是 C++ 语言是否可以保证派生的 objectds 具有与 base-struct 相同的大小,以便正确抵消对象之间的距离?

顺便说一句:类似问题的建议都不符合我的问题。

标签: c++

解决方案


一般来说,没有这样的保证。特别是,例如,如果您引入虚拟成员函数,则通常会有额外的内存用于虚拟表指针。

如果我们添加一个额外的假设,即派生类是标准布局,并且没有使用诸如“打包”之类的非标准特性,那么实际上大小将是相同的。

但是,即使大小相同,您在技术上也不能假装派生类型的数组是基类型的数组。特别是,使用指向 base 的指针迭代“假装”数组将具有未定义的行为。至少在 C++ 中是这样的。这些操作大概是在 C 中跨 API 执行的。我真的不知道在那种情况下有什么保证。


我建议如果您需要处理 C 结构的数组(即指针将由 API 递增或下标),那么不要包装单个结构,而是为整个数组创建一个 C++ 包装器。


推荐阅读