2016-04-08 10 views
0

Boxのスマートポインタ(以下のコードではBox3)をコンストラクタ(以下のコードではBox2)の呼び出しによって、またはこれら2つの構成の間には本質的に主観的好みの問題がある。`make_unique`をプレーンコンストラクタよりも優れていますか?

#include <iostream> 
#include <memory> 

class Box{ 
    private: 
     double length; 
     double width; 
     double height; 
    public: 
     Box(double lengthValue, double widthValue, double heightValue); 
     double volume() const;  
}; 
Box::Box(double lValue, double wValue, double hValue): 
    length {lValue}, width {wValue}, height {hValue} { 
} 
double Box::volume() const { 
    return length * width * height; 
} 
int main() {  
    Box Box2 {1.5,2.5,3.5}; 
    std::cout << Box2.volume() << std::endl;  
    auto Box3 = std::make_unique<Box>(1.5,2.5,3.5); 
    std::cout << Box3->volume() << std::endl; 
    return 0; 
} 
+3

ポインタを使用しても、ポインタを使用しない場合に比べて「利点」があるわけではありません。ポインターが必要な場合があります*。ダイナミックメモリ割り当てが必要な場合もあります*。あなたがそれらを必要としない場合、それらを「ただのために」使用しないでください。 –

答えて

8

ダイナミックアロケーションは、C++の他の基本操作に比べて高価な操作であるため、必要ない場所での使用を避ける必要があります。

つまり、1つの大きな違いは、動的割り当てが遅いことです。

もう1つの違いは、これでできることです。動的に割り当てられたインスタンスは、所有権を移動することによって、作成されたブロックの後も持続するようにすることができます。対照的に、直接宣言された変数は、実行がブロックを離れると存在しなくなります。

-1

提供されるコードには利点はありませんが、欠点のみです。

0

Box2の - スタック上に割り当てられ

利点

  • 割り当てが安価である(単にスタックポインタをデクリメント)

Disadvatages

  • 、それが宣言されたときBox2のための関連するBoxを作成する必要があります
  • スタックメモリが限られており、あなたはあなたがコピー(または移動)することなく、別のオブジェクトにBox2を移動することはできません
  • を実行した場合、プログラムはおそらくクラッシュするすべてのデータメンバーを個別に管理します。

BOX3 - ヒープに割り当て

利点

  • あなたはメモリ条件 `キャッチ(STD :: bad_alloc)の外にキャッチし、潜在的に
  • をクラッシュすることなく、それらに対処することができます
  • 宣言後にオブジェクトBoxを作成することもできますBox3
  • 個々のデータメンバーをすべてコピー(または移動)せずにBoxオブジェクトを移動することができます。

Disadvatages

  • BOX3は、低速動作であるヒープ上に割り当てられています。
+0

この回答には眉を上げる瞬間があります。 _「ボックス2は決してヌルになることはできません」、「不利益」_の下にしっかりと置かれていますか?本当に? "スタック"/"ヒープ"の使用。動的に割り当てられたオブジェクトからのみ「移動」できると考えているのはなぜですか? etc –

+0

#軌道の競合 - あなたの懸念に対処するために答えを編集しようとしました。修正が必要と思われるものは自由に修正してください。 – doron

+0

もっと良いと思いますが、「スタック上の」/「ヒープ上の」用語を避け、割り当てのセマンティクスとストレージの持続時間について話すのが良いでしょう。 –

関連する問題