test ortamı:Kullanıcı tarafından yazılmış bir kurucu neden oluşturulan derlemeyi etkiler?
// a demo for return value
class C
{
public:
int value;
int value2;
int value3;
//C(int v=0): value(v) {};
};
C getC(int v)
{
C c1;
return c1;
}
int main()
{
C c1 = getC(10);
return 0;
}
ve asm çıkışı: 2008 vs, ayıklama modu
Test kodudur
asm çıktısı; 39 : C c1 = getC(10);
push 10 ; 0000000aH
lea eax, DWORD PTR $T2595[ebp]
push eax
call [email protected]@[email protected]@[email protected] ; getC
add esp, 8
mov ecx, DWORD PTR [eax]
mov DWORD PTR $T2594[ebp], ecx
mov edx, DWORD PTR [eax+4]
mov DWORD PTR $T2594[ebp+4], edx
mov eax, DWORD PTR [eax+8]
mov DWORD PTR $T2594[ebp+8], eax
mov ecx, DWORD PTR $T2594[ebp]
mov DWORD PTR _c1$[ebp], ecx
mov edx, DWORD PTR $T2594[ebp+4]
mov DWORD PTR _c1$[ebp+4], edx
mov eax, DWORD PTR $T2594[ebp+8]
mov DWORD PTR _c1$[ebp+8], eax
, biz derleme 2 oluşturmak görebilirsiniz geçici nesne Ben aşağıdaki gibi yapıcı tanımladığınızda
Ancak:
Açıkçası; 39 : C c1 = getC(10);
push 10 ; 0000000aH
lea eax, DWORD PTR _c1$[ebp]
push eax
call [email protected]@[email protected]@[email protected] ; getC
add esp, 8
, derleyici kodu optimize etmek ve benim sorum: programı
C(int v=0): value(v) {};
ve yeniden derlenmesi, asm çıkışı haline edilir
Kullanıcı tarafından yazılan kurucunun eklenmesi oluşturulan derlemeyi neden bu kadar çok etkiliyor?
VC++ derleyicisi tutarlı olarak [Kopya Elision] (http://en.wikipedia.org/wiki/Copy_elision) gerçekleştirmez. Bunun bir örneğini görüyorsun. –
Ben * açık * yerine * kullanıcı tarafından yazılmış * terimini kullanmak için düzenledim çünkü ikinci bir kafa karıştırıcı çünkü 'constlicctors 'için bir' explicit 'anahtar kelimesi var (ve bu o değil) –
Hata ayıklama sırasında oluşturulan derleme koduna çok fazla okumak. Hata ayıklama yapısı kullanıldığında, derleyici adım adım hata ayıklama gerçekleştirebilmesini sağlar; Bu, sırayla, optimizasyonların her zaman kullanılamayacağı anlamına gelir. Oluşturulan düzene bakmak istiyorsanız, bunu en iyi şekilde Sürüm oluşturma bölümünde yapın. – MicroVirus