【发布时间】:2019-08-15 05:13:41
【问题描述】:
我有一个带有两个 64 位整数成员的结构 X 和一个构造函数:
struct X
{
X(uint64_t a, uint64_t b)
{
a_ = a; b_ = b;
}
uint64_t a_, b_;
};
当我查看未启用优化的编译器输出(x86-64 gcc 8.3 和 x86-64 clang 8.0.0,在 64 位 Linux 上)时,我看到构造函数的以下代码。
x86-64 gcc 8.3:
X::X(unsigned long, unsigned long):
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-8], rdi
mov QWORD PTR [rbp-16], rsi
mov QWORD PTR [rbp-24], rdx
mov rax, QWORD PTR [rbp-8]
mov QWORD PTR [rax], 0
mov rax, QWORD PTR [rbp-8]
mov QWORD PTR [rax+8], 0
mov rax, QWORD PTR [rbp-8]
mov rdx, QWORD PTR [rbp-16]
mov QWORD PTR [rax+8], rdx
mov rax, QWORD PTR [rbp-8]
mov rdx, QWORD PTR [rbp-24]
mov QWORD PTR [rax], rdx
nop
pop rbp
ret
x86-64 铿锵声 8.0.0:
X::X(unsigned long, unsigned long):
push rbp
mov rbp, rsp
mov qword ptr [rbp - 8], rdi
mov qword ptr [rbp - 16], rsi
mov qword ptr [rbp - 24], rdx
mov rdx, qword ptr [rbp - 8]
mov qword ptr [rdx], 0
mov qword ptr [rdx + 8], 0
mov rsi, qword ptr [rbp - 16]
mov qword ptr [rdx + 8], rsi
mov rsi, qword ptr [rbp - 24]
mov qword ptr [rdx], rsi
pop rbp
ret
有谁知道为什么输出如此复杂?即使没有启用优化,我也会期待两个简单的“mov”语句。
【问题讨论】:
-
a_ = a; b_ = b;不是初始化。是任务。试试X(uint64_t a, uint64_t b) : a_(a), b_(b) {} -
如果你禁用优化,你不应该期望优化代码。
-
@NathanOliver 在这种情况下(因为它们是
ints)是相同的。 -
@Artyer 这不是初始化与构造函数主体。任何一个版本都会生成同样奇怪的 mov:gcc.godbolt.org/z/PsJVwr.
-
是否有可能您发布的程序集实际上不是来自您发布的源代码?如果我添加诸如
uint64_t a_ = 0;之类的课堂作业,我只会得到归零
标签: c++ gcc assembly clang compiler-optimization