【发布时间】:2016-06-04 10:49:10
【问题描述】:
我正在查看 Visual Studio 为这个简单的 x64 程序生成的程序集:
struct Point {
int a, b;
Point() {
a = 0; b = 1;
}
};
int main(int argc, char* argv[])
{
Point arr[3];
arr[0].b = 2;
return 0;
}
当它遇到arr[0].b = 2时,它会生成这个:
mov eax, 8
imul rax, rax, 0
mov dword ptr [rbp+rax+4],2
为什么它使用 imul rax, rax, 0 而不是简单的 mov rax, 0,甚至是 xor rax, rax?如果有的话,imul 如何更有效?
【问题讨论】:
-
尝试使用优化开关进行编译。
-
我试过没有优化和使用 /02,但它仍然是 imul rax,rax,0。通过完全优化,我什至无法让它真正向 arr[0] 写入任何内容,它会将所有内容存储为临时变量或类似的东西
-
你的VS看起来和我的不一样。正如预期的那样,这根本不会使用 /O2 生成任何代码。重新调整代码以使优化器无法删除分配,从而按预期生成 mov dword ptr [rsp+24h],2 。 imul 只会在未优化的构建中生成。