我对子对象的动态内存分配过程有疑问。 代码:
#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;
}
g++
和clang++
的结果不同。但由于8 + 8 + 4 = 20
,我预计会打印20
。你能解释一下这些参数值的意义吗,传递给操作员new?
答案 0 :(得分:2)
默认情况下,gcc使用32位模式,clang使用64位模式。 long
的大小足以表示至少32位。在典型的32位系统上,这将使用4个字节用于int
和long
。在64位系统上int
和long
倾向于使用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进行分配