MyClass hoge(〜);
と
スマポ<MyClass> hoge_p = new MyClass(〜);
のどちらでも同じ仕事ができる場合、
大抵は前者を選ぶと思うのですが、
後者を選ぶ場合にはどんなものがあるのでしょうか?
(関数からhoge_pを返すことはしません。)
MyClass が特に巨大なオブジェクトでヒープに入れたい場合とかでしょうか?
コンストラクタを引数つきで呼べるとか
他のクラスのメンバ変数にしたときポインタなりスマポなら
コンパイル依存性を減らせる可能性がある
Effective C++ 第3版
31項 ファイル間のコンパイル依存性をなるべく小さくしよう
526 :
523:2010/01/01(金) 00:15:52
みなさんありがとうございます。
>>524 前者も呼べますよね?
>>525 コンパイル依存性を減らすというのは考えていませんでした。
確かにそうですね。
あとは破棄するタイミング
hogeを複数のオブジェクトが参照してるとき
後者のスマポがshared_ptrなら参照が0になるまで破棄されないので
破棄するタイミングを気にせずに複数のオブジェクトから使用できる
前者の場合、
hogeの生存期間 >= 複数のオブジェクトがhogeを参照する期間
を保障しないといけない
>>527 でも
> 関数からhoge_pを返すことはしません。
って書いてあるからそれは心配ないのでは?
あー、そうなるとスマポ使ってもあんまりメリット無いね
530 :
523:2010/01/01(金) 13:56:39
みなさん
ありがとうございます。
前者のMyClass hoge(〜);でスタックに確保できずに失敗する可能性と、
後者のスマポ<MyClass> hoge_p = new MyClass(〜);でヒープに確保できずに失敗する可能性と、
どっちを畏れるべきでしょうか?
>530
>MyClass が特に巨大なオブジェクトでヒープに入れたい場合とかでしょうか?
等おそれるべき理由がない限り、確保失敗の可能性など無視してオブジェクトの生存期間から決定する。
おそれるべき理由がある場合、どちらをおそれるべきかもはっきりするはずなのでそれに従う。
532 :
530:2010/01/01(金) 20:06:56
>>531 としますと、例えば
void foo(const MyClass& str)
{
MyClass hoge(〜);
hoge.bar(str);
return;
}
これと
void foo(const MyClass& str)
{
スマポ<MyClass> hoge_p = new MyClass(〜);
hoge_p->bar(str);
return;
}
これは等価なコードとなりると思うのですが、
この場合はどちらでも良い、悪く言えばその場の気分次第ということなのでしょうか?
>>532 前者は、スタックを消費する。速い
後者は、ヒープを消費する。前者より少し遅い。
共有しないという前提(参照は可能)がある場合なら前者のほうがメリットがあると思う。
共有する場合は後者になるのかな。
等価なわけないだろ。
スマポ噛ませてる分処理は遅くなるしnewの速度コストなんてスタック配置の何千倍だから無駄。
>>530 スタックオーバーフローを恐れるような大きなオブジェクトじゃない場合はスタックに置いていいんじゃないか。
また、あまり大きいオブジェクトがあると、スタックフレームの増大で(E)BPからのオフセットが大きくなってプログラムサイズが若干大きくなる可能性があるね。たとえばスタックフレームを128バイト未満にするとかが目安かもね。
536 :
532:2010/01/01(金) 21:46:44
>>533-535 ありがとうございます。
やはり巨大じゃないオブジェクトで意味的に等価なコードならスタックにおくべきという
ことなのですね。