如何完成内存对齐?

时间:2014-10-29 01:31:15

标签: c++ inheritance memory-alignment

看看这两个案例:

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)。

对于内存对齐方式有没有解释?

2 个答案:

答案 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字节的整数倍