cevap

7

Yapamazsınız. Sadece bu kadar basit. RVO/NRVO Standarttır ve kodunuz mevcut olmamasına bağlı olmamalıdır.

+3

RVO/NRVO'ya ** değinebileceği kadarıyla ** standart değil (bkz. C++ 0x standardı, bölüm 12.8. Sınıf nesnelerini kopyalama ve taşıma, paragraf 32)). Standart, bu tür bir optimizasyona izin verir (g ++ ve VisualStudio bunu uygular). Bununla bir problemim yok. Ama devre dışı bırakmak için biraz geçiş yapmak güzel olurdu. Eğitim amaçlı belki. Teşekkürler, şimdi çok daha net :) – Goran

+0

@Goran: Standart açıkça izin veriyorsa, o zaman Standarttır. – Puppy

+2

İzin! = Gerektirir. Standartın bir parçası olmadığı için standartla çelişmez. –

1

Değişkeninizi volatile olarak tanımlamaya çalışın, sorununuzu çözebilir. Değilse, kodu göndermelisiniz ...

+0

+1; Bu sadece rastgele bir tahmindir (ve bu nedenle aşağı inme hak ediyor) olmasına rağmen, 'my_volatile_variable' dönüşü, RVO'yu devre dışı bırakır. (C++ 11 §12.8/31 madde 1.) – Potatoswatter

+0

@Potatoswatter: Cevabımı neden sadece rastgele bir tahmin olarak düşündüğünüzü merak ediyorum. Cevabımdaki "belki", bu sorunun ne olduğundan emin olmadığım için gerçek sorunun ne olduğunu bilmediğim anlamına geliyordu. IMHO, bu soru, http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – Malkocoglu

+0

Ah, özür dilerim. Sanırım seni bu yüzden reddettiler. (“Volatile” ile ilgili bir cevabı haklı çıkarmak daha iyidir.) – Potatoswatter

0

Bu optimizasyonu devre dışı bırakmak için herhangi bir sebep yoktur! Neyi başarmaya çalışıyorsun? Hata ayıklama işlemlerinin, herhangi bir kötü yan etki olmadan daha hızlı çalışmasına yardımcı olur. Ayrıca, RVO'ya veya NRVO'ya bağlı kodun hata ayıklama ve serbest bırakmada aynı şekilde çalışmasını sağlar.

+11

Birini (en azından benim için) çok önemli bir sebep olarak düşünebilirim: eğitim! Derleyicileri ihmal ettiğinde, yapıcıları nasıl açıklar, kurucuları/taşınırları, işlev çağrılarındaki yıkıcıları nasıl açıklarsınız? Böyle bir seçeneği desteklemek için g ++ 'ya çok müteşekkirim. – Goran

+0

Döndürülmüş bir değerin ömrünü anlamak için onu devre dışı bırakmak zorundayım, bunu şimdi anlayamıyorum çünkü geçici yaratmıyor, sadece doğrudan kopyalar. – Zebrafish

İlgili konular