2012-10-14 11 views
7

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?

+0

VC++ derleyicisi tutarlı olarak [Kopya Elision] (http://en.wikipedia.org/wiki/Copy_elision) gerçekleştirmez. Bunun bir örneğini görüyorsun. –

+0

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) –

+8

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

cevap

1

Bu soru, C++ uygulamasında elemen ve dönüş değeri optimizasyonu hakkındadır.

Oluşturduğunuz derleme kodunun derleyiciye bağlı olması nedeniyle üzerinde fazla zaman harcamamanızı öneririm.

kopyalama elision standardında tanımlanmıştır:

belirli kriterler karşılandığı

, bir uygulama, bir sınıf nesnesi kopyalama/taşıma yapı ihmal bırakılır bile kopyalama/taşıma yapıcı ve/veya Nesne için yıkıcı yan etkileri vardır. Bu gibi durumlarda, uygulama, ihmal edilen kopyalama/taşıma işleminin kaynağını ve hedefini, aynı nesneye atıfta bulunmak için iki farklı yol olarak ele alır ve bu nesnenin tahribatı, iki nesnenin ne zaman olacağı, daha sonraki zamanlarda gerçekleşir. optimizasyon olmadan yok edildi.

[...]

§12.8 [class.copy: kopya elision adı kopya/taşıma işlemlerinin bu elision, (çoklu kopya yok etmek için birleştirilebilir), aşağıdaki koşullar altında izin verilir ]

Yığınlama akışı, see here başvuruda bulunabileceğiniz bir sorun var.