【发布时间】:2020-09-08 14:51:31
【问题描述】:
#include <iostream>
class B
{
public:
virtual void f() {std::cout<<"HI";}
int x;
};
class A
{
public:
void f() {std::cout<<"HI";}
int x;
};
int main () {
A a;
B b;
std::cout<<sizeof(a)<<" "<<sizeof(b);
return 0;
}
输出是
4 16
我希望它长 8 个字节 - vptr 指针。但是剩下的 4 个字节是用来做什么的呢? 我发现了很多forum posts(都是几年前的),人们在其中讨论过使用 vprt 的类中的对象长 4 或 8 个字节。我还检查了online C++ shell - 输出是一样的。
【问题讨论】:
-
对齐填充,我猜。
-
在这里查看我的答案:stackoverflow.com/questions/58435348/… 不确定它是否符合欺骗的条件。
-
这是因为一个指向虚函数表的新指针,当然还有填充,(从 12 到最接近的 2 的完美幂,即 16)。在类似的问题上检查此answer。
-
@FredLarson 哦,你节省了我的时间,非常感谢!我完全忘记了对齐可能发生。长整数是 8 和 16
-
如果您为 32 位目标而不是 64 位编译,您会观察到不同的大小。即4和8.
标签: c++ c++11 polymorphism virtual vptr