【问题标题】:C++ Function returning object created on the stackC++ 函数返回在堆栈上创建的对象
【发布时间】:2015-04-23 00:59:52
【问题描述】:

我知道,当我使用__stdcall(对于其他调用约定也是如此)时,返回值存储在eax 寄存器中。 我想知道以下是如何发生的:

class MyObject
{
private:
    int fourBytesInt;
    long fourBytesLong;
    char name[256];
};

MyObject ReturnMe()
{
    MyObject myObj = MyObject();

    return myObj;
}

int main(void)
{
    MyObject myObj = ReturnMe();

    return 0;
}

sizeof(myObj) 是 264 字节,ReturnMe 函数如何返回这么大的对象,因为寄存器最多可以容纳 32 位(x86 架构)。

谢谢!

【问题讨论】:

  • 因为编译器会生成复制对象的代码。
  • 或者就地构造对象(NRVO)。

标签: c++ x86 stack cpu-registers


【解决方案1】:

返回值只放置在足够小的数据类型的寄存器中。否则,它们将作为堆栈上的副本返回。或者有时可以省略副本。

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多