Yazdığınız kodun doğruluğu asla bir optimizasyona bağlı olmamalıdır . Spesifikasyonda kullandıkları C ++ "sanal makinede" çalıştırıldığında doğru sonucu vermelidir.
Ancak, bahsettiğiniz şey daha çok bir tür etkinlik sorusudur. RVO optimizasyon derleyici ile optimize edildiğinde kodunuz daha iyi çalışır. Sorun değil, diğer nedenlerde belirtilen tüm nedenlerden ötürü.
Ancak, bu optimizasyona ihtiyacınız varsa (örneğin, kopya kurucu aslında kodunuzun başarısız olmasına neden olursa), şimdi derleyicinin kaprislerinde olacaksınız.
Sanırım bunun kendi uygulamamdaki en iyi örneği kuyruk çağrısı optimizasyonu:
int sillyAdd(int a, int b)
{
if (b == 0)
return a;
return sillyAdd(a + 1, b - 1);
}
Aptalca bir örnek, ancak bir fonksiyonun sonunda fonksiyonun tekrarlı olarak çağrıldığı bir kuyruk çağrısı gösterir. C ++ sanal makinesi bu kodun düzgün çalıştığını gösterse de, neden böyle bir ekleme yordamı yazmayı neden rahatsız ettiğim konusunda biraz karışıklığa neden olabilirim . Ancak, C ++ 'nın pratik uygulamalarında bir yığına sahibiz ve sınırlı bir alanı vardır. Bilgi niteliğinde bir şekilde yapılırsa, bu fonksiyon en az b + 1
yığın çerçevelerini, eklenmesi gibi yığının üzerine itmek zorunda kalacaktır . Hesaplamak istersem sillyAdd(5, 7)
bu önemli bir şey değil. Hesaplamak istersem sillyAdd(0, 1000000000)
, bir StackOverflow'a neden olmakta zorlanabilirim (ve iyi olanı değil ).
Ancak, bu son dönüş hattına ulaştığımızda, şu anki yığın çerçevesindeki her şeyle işimiz bittiğini görebiliriz. Gerçekten etrafta kalmamıza gerek yok. Kuyruk çağrısı optimizasyonu, bir sonraki fonksiyon için mevcut yığın çerçevesini "yeniden" kullanmanızı sağlar. Bu şekilde, sadece 1 yığın çerçevesine ihtiyacımız var b+1
. (Hala bütün bu aptalca toplama ve çıkarma işlemlerini yapmak zorundayız, ancak daha fazla yer kaplamıyorlar.) Aslında, optimizasyon kodu şöyle yapar:
int sillyAdd(int a, int b)
{
begin:
if (b == 0)
return a;
// return sillyAdd(a + 1, b - 1);
a = a + 1;
b = b - 1;
goto begin;
}
Bazı dillerde, kuyruk çağrısı optimizasyonu, spesifikasyon tarafından açıkça talep edilmektedir. C ++ onlardan biri değil . Durumda arama yapmazsam, bu kuyruk çağrısı optimizasyon fırsatını tanımak için C ++ derleyicilerine güvenemiyorum. Visual Studio sürümümle birlikte, sürüm sürümü kuyruk çağrısı optimizasyonunu yapar, ancak hata ayıklama sürümü (tasarımdan değil) yapmaz.
Bu yüzden hesaplayabilmeye bağlı kalmak benim için kötü olurdu sillyAdd(0, 1000000000)
.