簡體   English   中英

C ++外觀避免復制

[英]C++ facade avoiding copies

考慮以下簡化的外觀模式:

  class Foo {
  public:
    int times;

    int eval(const int val) { return val*times; }
  };

  class Bar {
    Foo foo;
  public:
    Bar(const Foo& f) : foo(f) {}

    double eval(const double val) { return val * foo.times; }
  };

顯然,只需要Bar的實例即可評估Foo的eval()方法的特殊(即雙值)解釋。 吧台除了轉發給它的foo外,沒有其他成員。

出於安全原因,我沒有在Bar內部使用const引用或pointer (我只是不知道Bar實例是否可能在某個時刻從stack幀中逸出,因此資源管理很重要)。

我的問題有兩個:

  1. C++ 編譯器是否可以檢測到Bar只是一個外觀並“ 內聯 ”成員訪問?
  2. 是否有(安全)方法來防止復制傳遞的對象?
  1. 在某些平台(gcc / clang)上,您可以強制使用always_inline屬性進行內聯,或者在未內聯函數的情況下發出警告。
  2. 不,如果您不想復制,則需要保證對象在其他地方的生命周期。 如果您認為這不安全,請不要這樣做。 您可以做的就是移動一個對象。 這樣可以避免復制和使用期限問題,但是對於您的編譯器來說可能是不可能的。

例如:

 struct Bar {
   // Only accept rvalues of Foo
   explicit Bar(Foo&& f) : f(std::move(f)) {}
   Foo f;
 };

1-是的,編譯器很可能會內聯函數[取決於編譯器]。

2-始終堅持RAII 在C ++ 3中, Foo對象foo應該是成員變量(如您所做的那樣)或托管指針(在復制構造函數和賦值運算符中復制,並在析構函數中刪除)。 在C ++ 11中,您可以使用正確的值引用。

注意:此示例不是立面!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM