質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

5761閲覧

ポインタの参照渡しの理由

HikuichiSan

総合スコア24

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/03/26 02:16

関数にポインタの参照を渡す場合と、ポインタを直で渡す場合、
ポインタの指す先を変えられるかどうかが異なる点は理解しています。

しかし、例えばrosのコールバック関数にはboost::shared_ptrのconst参照を渡します。

typedef boost::shared_ptr<const std_msgs::String> std_msgs::String::ConstPtr void callback(const std_msgs::String::ConstPtr& msg)

この場合、const参照であることでmsgの指す先を変えられないようにして、
boost::shard_ptr<const std_msg::String>でmsgの内容を書き換えられない様になっていると思うのですが、
std_msgs::String::ConstPtrをそのまま渡さないのはなぜでしょうか?

sharedポインタのコピーオーバヘッドを避けている?様にも見えますが、
ポインタのコピーオーバヘッドがそこまで大きいとは思えません。
こういったコーディングは何を目的としているのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

コピーのオーバーヘッドを避けるためです。
shared_ptrはスマートポインターであり、ポインターではありませんので、コピーの処理が入ってしまいます。

投稿2020/03/26 02:19

yuki23

総合スコア1448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

shared_ptr参照カウントで実装されていますので、コピーすると参照カウントが変化します。

一時的に使って参照カウントを変える必要がないなら、const &で渡してコピー(=参照カウントの変化)を避けるのが合理的です。

投稿2020/03/26 02:19

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/03/26 02:20

特に、shared_ptrはスレッドセーフが保証されていますので、コピー時の参照カウントの変化がロックなどを巻き起こす可能性も否定できません。不要なコピーは減らす必要があります。
HikuichiSan

2020/03/26 02:22

ありがとうございます。スマートポインタは普通のポインタとは分けて考える必要があるのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問