C++相談室 part76

このエントリーをはてなブックマークに追加
523デフォルトの名無しさん
MyClass hoge(〜);

スマポ<MyClass> hoge_p = new MyClass(〜);
のどちらでも同じ仕事ができる場合、
大抵は前者を選ぶと思うのですが、
後者を選ぶ場合にはどんなものがあるのでしょうか?
(関数からhoge_pを返すことはしません。)

MyClass が特に巨大なオブジェクトでヒープに入れたい場合とかでしょうか?
524デフォルトの名無しさん:2009/12/31(木) 23:52:27
コンストラクタを引数つきで呼べるとか
525デフォルトの名無しさん:2010/01/01(金) 00:13:48
他のクラスのメンバ変数にしたときポインタなりスマポなら
コンパイル依存性を減らせる可能性がある

Effective C++ 第3版
31項 ファイル間のコンパイル依存性をなるべく小さくしよう
526523:2010/01/01(金) 00:15:52
みなさんありがとうございます。

>>524
前者も呼べますよね?

>>525
コンパイル依存性を減らすというのは考えていませんでした。
確かにそうですね。
527デフォルトの名無しさん:2010/01/01(金) 00:49:02
あとは破棄するタイミング
hogeを複数のオブジェクトが参照してるとき

後者のスマポがshared_ptrなら参照が0になるまで破棄されないので
破棄するタイミングを気にせずに複数のオブジェクトから使用できる

前者の場合、
hogeの生存期間 >= 複数のオブジェクトがhogeを参照する期間
を保障しないといけない
528デフォルトの名無しさん:2010/01/01(金) 08:58:15
>>527
でも
> 関数からhoge_pを返すことはしません。
って書いてあるからそれは心配ないのでは?
529デフォルトの名無しさん:2010/01/01(金) 12:41:10
あー、そうなるとスマポ使ってもあんまりメリット無いね
530523:2010/01/01(金) 13:56:39
みなさん
ありがとうございます。

前者のMyClass hoge(〜);でスタックに確保できずに失敗する可能性と、
後者のスマポ<MyClass> hoge_p = new MyClass(〜);でヒープに確保できずに失敗する可能性と、
どっちを畏れるべきでしょうか?
531デフォルトの名無しさん:2010/01/01(金) 14:38:49
>530
>MyClass が特に巨大なオブジェクトでヒープに入れたい場合とかでしょうか?
等おそれるべき理由がない限り、確保失敗の可能性など無視してオブジェクトの生存期間から決定する。
おそれるべき理由がある場合、どちらをおそれるべきかもはっきりするはずなのでそれに従う。
532530: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;
}
これは等価なコードとなりると思うのですが、
この場合はどちらでも良い、悪く言えばその場の気分次第ということなのでしょうか?

533デフォルトの名無しさん:2010/01/01(金) 21:07:36
>>532
前者は、スタックを消費する。速い
後者は、ヒープを消費する。前者より少し遅い。
共有しないという前提(参照は可能)がある場合なら前者のほうがメリットがあると思う。
共有する場合は後者になるのかな。

534デフォルトの名無しさん:2010/01/01(金) 21:09:23
等価なわけないだろ。
スマポ噛ませてる分処理は遅くなるしnewの速度コストなんてスタック配置の何千倍だから無駄。
535デフォルトの名無しさん:2010/01/01(金) 21:14:59
>>530
スタックオーバーフローを恐れるような大きなオブジェクトじゃない場合はスタックに置いていいんじゃないか。
また、あまり大きいオブジェクトがあると、スタックフレームの増大で(E)BPからのオフセットが大きくなってプログラムサイズが若干大きくなる可能性があるね。たとえばスタックフレームを128バイト未満にするとかが目安かもね。
536532:2010/01/01(金) 21:46:44
>>533-535
ありがとうございます。
やはり巨大じゃないオブジェクトで意味的に等価なコードならスタックにおくべきという
ことなのですね。