c++ - 有没有办法让子班省略父母不必要的成员?
问题描述
在以下示例中(coliru 链接)有 2 个子类Child_pub
和Child_pro
,它们基本相同,只是它们继承自不同的父类:
- 第一个父母,
Parent_priv
有一个private
int
成员v
, - 第二个父母,
Parent_prot
有一个protected
int
成员v
。
继承自的类Parent_prot
可以访问该int
成员v
,而继承自的类Parent_priv
则没有,但它仍然具有其体积。
所以我的问题是:即使这private
v
对子类没有任何影响,为什么编译器不能从子类中优化它?为什么我的示例不能在第二种情况下4
打印?sizeof
哪条 C++ 法律禁止这样做?
#include <iostream>
class Parent_priv {
private: int v;
};
class Parent_prot {
protected: int v;
};
class Child_priv final : public Parent_priv {
int x;
};
class Child_prot final : public Parent_prot {
int x;
};
int main() {
Child_prot child_prot;
Child_priv child_priv;
std::cout << "sizeof(child_prot) = " << sizeof(child_prot) << '\n'; // prints 8 on my system
std::cout << "sizeof(child_priv) = " << sizeof(child_priv) << '\n'; // also 8
}
有没有办法让编译器(我们同时使用,GCC 和 Clang)优化 child_priv
为 sizeof
4?
当然,在我们的真实代码中这些父类还有更多,所以不继承不是一种选择。
上下文:在我们的代码中,我们通过 TCP 发送大量类似的子类,这些子类使用来自其父级的不必要的大量数据,使用依赖于sizeof
. 我们必须为所有这些子类实现自定义序列化,手动省略不需要的成员变量,这显然是我们不喜欢的。
- 是的,我们已经在使用 zlib 压缩网络包。
- 不,我们不能使用 UDP 代替 TCP。
解决方案
不,你不能那样做,有充分的理由
从 Parent_prot 继承的类可以访问该 int 成员 v,而从 Parent_priv 继承的类没有,但它仍然具有它的体积。
Child_priv
不能直接访问Parent_priv::v
,但可能是成员函数或Parent_priv
使用它的朋友。
如果没有使用Parent_priv::v
,为什么首先声明它?
编译器应该如何区分您不想删除的数据成员和我添加以使填充显式的数据成员?
推荐阅读
- javascript - Javascript:为 Thymeleaf 转义双方括号
- html - SVG 百分比坐标已关闭
- scala - 使用它自己的一些参数实例化一个 Scala 案例类参数
- c++ - OpenGL 4x4 矩阵通过 X 轴移动对象
- python - 如何使用 selenium python 抓取雅虎财经搜索自动建议结果?
- javascript - ckeditor更改html代码结构
- batch-file - 在 Windows 脚本中将文件添加到存档
- c# - web api服务随机死亡而不抛出异常?
- c++ - 变量“std::ofstream outfile”具有初始化程序但类型不完整
- ubuntu - 如何在 Ubuntu 18.04 中安装 Aegisub