我有一个结构体 X,其中包含两个 64 位整数成员和一个构造函数:
struct X
{
X(uint64_t a, uint64_t b)
{
a_ = a; b_ = b;
}
uint64_t a_, b_;
};
当我查看编译器输出(在64位Linux上使用x86-64 gcc 8.3和x86-64 clang 8.0.0,没有启用任何优化)时,我看到构造函数的以下代码。
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 clang 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) {}
进行初始化。 - NathanOliveruint64_t a_ = 0;
)后,我才会得到归零操作。 - Zan Lynx