【问题标题】:Dynamic subobject memory allocation Clang++ vc g++动态子对象内存分配 Clang++ vs g++
【发布时间】:2014-08-23 14:17:43
【问题描述】:

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

#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 的参数值的意义吗?

【问题讨论】:

    标签: c++ g++ clang


    【解决方案1】:

    看起来你默认使用 32 位模式用于 gcc 和 64 位模式用于 clang。 long 的大小至少足以表示 32 位。这将在典型的 32 位系统上为 intlong 使用 4 个字节。在 64 位系统上,intlong 倾向于使用 64 位,即 32 位。您可能想要打印sizeof(int)sizeof(long)。即使sizeof(int) &lt; sizeof(long),该类型也可能被填充为sizeof(long).的倍数

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-05-04
        • 1970-01-01
        • 2010-12-04
        • 1970-01-01
        • 1970-01-01
        • 2016-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多