不要仍宣佈臨時對象是一個不錯的選擇,並且獲得良好的優化編譯器應該是一樣有效,因爲你以前做什麼, (比如gcc -O3
)。
見得到的組件從gcc -O3
這裏:https://goo.gl/uCPAa9
使用此代碼:
#include<complex>
std::complex<float> scf1(float x) {
float r = 0., i = 0.;
sincosf(x, &r, &i);
return std::complex<float>(r, i);
}
void scf2(std::complex<float>& cmp, float x) {
float r = 0., i = 0.;
sincosf(x, &r, &i);
cmp.real(r);
cmp.imag(i);
}
void scf3(std::complex<float>& cmp, float x) {
float r = 0., i = 0.;
sincosf(x, &cmp.real(), &cmp.imag());
}
哪裏scf2
相當於你的說法,你可以在這三種情況下看到非常相似的組件。
scf1(float):
subq $24, %rsp
leaq 8(%rsp), %rsi
leaq 12(%rsp), %rdi
call sincosf
movss 12(%rsp), %xmm0
movss %xmm0, (%rsp)
movss 8(%rsp), %xmm0
movss %xmm0, 4(%rsp)
movq (%rsp), %xmm0
addq $24, %rsp
ret
scf2(std::complex<float>&, float):
pushq %rbx
movq %rdi, %rbx
subq $16, %rsp
leaq 8(%rsp), %rsi
leaq 12(%rsp), %rdi
call sincosf
movss 12(%rsp), %xmm0
movss %xmm0, (%rbx)
movss 8(%rsp), %xmm0
movss %xmm0, 4(%rbx)
addq $16, %rsp
popq %rbx
ret
scf3(std::complex<float>&, float):
pushq %rbx
movq %rdi, %rbx
subq $16, %rsp
leaq 8(%rsp), %rsi
leaq 12(%rsp), %rdi
call sincosf
movss 12(%rsp), %xmm0
movss %xmm0, (%rbx)
movss 8(%rsp), %xmm0
movss %xmm0, 4(%rbx)
addq $16, %rsp
popq %rbx
ret
嗯...從C++ 03標準[lib.complex]'T真實()const的; T imag()const;',所以這些函數永遠不會返回左值。無論是舊的stdlib實現還是舊的編譯器都不符合要求。 – Praetorian
我在98 ...我們有點遠遠 – Cory
你可以使用'reinterpret_cast'來獲得指向實部和虛部的指針。 'std :: complex'是我知道標準實際保證這個工作的一種情況。 –