2015-08-10 24 views
9

Şimdiye kadar kapsam korumasına bakıldığında, bir koruma boole değişkeni var. The simplest and neatest c++11 ScopeGuardC++: Neden bu basit Kapsam Muhafızı çalışıyor?

Ama basit bir nöbet çalışırken (gcc 4.9, çınlama 3.6.0):

template <class C> 
struct finally_t : public C { 
    finally_t(C&& c): C(c) {} 
    ~finally_t() { (*this)(); } 
}; 
template <class C> 
static finally_t<C> finally_create(C&& c) { 
    return std::forward<C>(c); 
} 
#define FINCAT_(a, b) a ## b 
#define FINCAT(a, b) FINCAT_(a, b) 
#define FINALLY(...) auto FINCAT(FINALY_, __LINE__) = \ 
    finally_create([=](){ __VA_ARGS__ }) 

int main() { 
    int a = 1; 
    FINALLY(std::cout << "hello" << a << std::endl ;); 
    FINALLY(std::cout << "world" << a << std::endl ;); 
    return 0; 
} 

hiçbir geçici kopya tahrip Neden Örneğin, bu tartışmaya bakınız? Bu davranışa güvenmek tehlikeli midir?

+2

'FINALLY' nedir? – Steephen

+9

Kopya Elision (veya bu durumda Move Elision) efektlerini gözlemliyorsunuz. Elision Kopyala **, ** garantili/zorunlu değildir, ancak genellikle optimizasyonları derlerken bile büyük derleyiciler tarafından gerçekleştirilir. Gcc'in "fno-elide-constructors" ı "break" ı görmek için deneyin: http://melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR – dyp

+0

Teşekkür ederim, @dyp. –

cevap

1

Kopya Elision (veya bu durumda Move Elision) etkilerini gözlemliyorsunuz. Kopya Elision garanti edilmez/zorunlu değildir, ancak w/o optimizasyonlarını derlerken bile büyük derleyiciler tarafından gerçekleştirilir. "Kırmak" için gcc's -fno-elide-constructors deneyin: http://melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR

İlgili konular