【问题标题】:Why does MSVC use the stack needlessly when returning a small struct in a register?为什么 MSVC 在寄存器中返回一个小结构时不必要地使用堆栈?
【发布时间】:2015-03-17 20:36:44
【问题描述】:

我在 MSVC 2013, x64, Release build with /02 上编译了以下代码:

struct Point
{
    int x;
    int y;
};

Point xUnit()
{
    Point p;
    p.x = 1;
    p.y = 0;
    return p;
}

xUnit() 生成的汇编代码为:

mov QWORD PTR p$[rsp], 1
mov rax, QWORD PTR p$[rsp]
ret 0

为什么它写入堆栈然后立即读回rax返回?

我早就料到了:

mov rax, 1
ret 0

【问题讨论】:

  • 您所期望的基本上是ClangGCC 在 gcc.godbolt.org 上生成的。
  • 哇,这是一个我不知道的非常有用的工具。谢谢!
  • 这个函数总是被内联的。查看未优化的代码是没有用的。
  • @HansPassant 他说他是用 /O2 编译的,所以我猜在这种特殊情况下 MSVC 有点问题。
  • 意识到mov rax, 1 还将Pointx 字段设置为0,这是一个非常棒的优化。很容易弄错并留下 x 未初始化。顺便说一句,我在 Compiler Explorer(@Columbo 给出的链接)上检查的所有 gcc 版本与 MSVC 基本相同:xUnit(): pushq %rbp movq %rsp, %rbp movl $1, -16(%rbp) movl $0, -12(%rbp) movq -16(%rbp), %rax popq %rbp ret

标签: c++ visual-studio visual-c++ optimization assembly


【解决方案1】:

X86 版本似乎表现不错(即生成“mov eax,1”)。

我的猜测是 X86 和 X64 版本是独立的代码库,在一个目标中找到的优化不一定存在于另一个目标中。

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
  • OP 询问为什么特定编译器不进行特定优化。我为不同目标(X86)测试了具有相同标志的同一程序的编译器输出,它确实优化了代码。由于 MSVC 不是公共领域的编译器,因此很难说出原因 - 可以推测或直接询问 MSVC 团队。
猜你喜欢
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2018-04-17
  • 2023-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多