动态子对象内存分配Clang ++ vc g ++

时间:2014-08-23 14:17:44

标签: c++ g++ clang

我对子对象的动态内存分配过程有疑问。 代码:

#include <iostream>

using std::cout;
using std::endl;

struct S
{
    long l;
};

struct V
{
    long d;
};

struct A
{
    int a;
};

struct B : A, S, V
{ 
    void * operator new(std::size_t t)
    {
        cout << t << endl;
        return ::operator new(t);
    }
};

B *b = new B; // Prints 12 for g++ and 24 for clang++.

int main()
{
    b -> a = 23;
    b -> l = 3L;
    b -> d = 52L;
}

demo for g++

demo for clang++

g++clang++的结果不同。但由于8 + 8 + 4 = 20,我预计会打印20。你能解释一下这些参数值的意义吗,传递给操作员new?

2 个答案:

答案 0 :(得分:2)

默认情况下,gcc使用32位模式,clang使用64位模式。 long的大小足以表示至少32位。在典型的32位系统上,这将使用4个字节用于intlong。在64位系统上intlong倾向于使用64位,即32位。您可能需要打印sizeof(int)sizeof(long)。即使sizeof(int) < sizeof(long),该类型可能会被填充为sizeof(long).的倍数

答案 1 :(得分:0)

似乎当使用g ++编译代码时,long的大小等于int的大小,而等于4。 当代码由clang编译时,long的大小等于8,而int的大小等于4. clang将结构附加4个字节,它将根据类型为long的类型对8进行分配