看看这两个案例:
class A {
public:
int a;
A () { a = 10;}
void foo () {std::cout << "a = " << a << std::endl;}
};
这里sizeof(A)给出4个字节,这是有意义的。
class A {
public:
int a;
A () { a = 10;}
virtual void foo () {std::cout << "a = " << a << std::endl;}
};
这里sizeof(A)给出16个字节而不是12个字节(指针为4 + 8)。
对于内存对齐方式有没有解释?
答案 0 :(得分:1)
由编译器决定虚函数的实现方式,但这里可能发生的是它希望/需要将8字节指针与8位内存地址上的虚拟调度表对齐。然后是{4字节a
,4填充,8 vdt指针}或{8 vdt指针,4字节a
,4填充} - 后者不太明显,但考虑{{1的数组需要连续且间隔为A
,因此在给定8字节对齐的情况下,12的四舍五入为16。
答案 1 :(得分:0)
FIRST在虚拟调度表中,可视化函数需要一个指针大小,在32位计算机中,指针的大小是4个字节,int 64位是8个字节。所以我认为你的电脑是64位。
SECOND sizeof(A)应该考虑填充和内存对齐。 这样排列16个字节:4个字节(int a)+ 8个字节(虚函数指针int 64位)+ 4个字节填充(因为A中元素的最大大小是8个字节的虚函数指针,所以sizeof(A)应该是8字节的整数倍