C言語の構造体の関数への渡し方について

C言語の構造体の関数への渡し方について C言語の構造体を関数に渡す場合、値渡しと参照渡しのどちらがよいでしょうか? その構造体の中身は書き換えない状況の場合です。(書き換える場合は参照渡しが当たり前ですが) 構造体などのいくつもデータをもっているものであると、値渡しではコピーをしてしまうので処理速度に影響を及ぼすのではないかと思っています。特に60fpsで実行しているゲームの描画に関係する関数なので使用頻度も高いです。 逆に参照渡しだと何かしらのコーディングミスで値を書き換えてしまう危険性云々・・・です。 明確な正解はないとは思いますので意見を聞かせていただけるとありがたいです。 特に企業でプログラムを書いてそれを販売用の製品にしている方の意見が聞ければさらにありがたいです。

C言語関連1,003閲覧xmlns="http://www.w3.org/2000/svg">500

ベストアンサー

0

> C言語の構造体を関数に渡す場合、値渡しと参照渡しのどちらがよいでしょうか? ポインタの値渡しでしょう。 (これを参照渡しと説明している書籍も多々ありますが C++ で本来の参照渡しなるものが別にあります。) typedef struct { ... } Hoge; void func(const Hoge *pHoge); と引数のポイント先を const 修飾させることで func 内のコーディングミスで書き換えられないようにガードしましょう。 また、使用時のコードイメージは以下になります。 void foo(void) { Hoge hoge; ... func(&hoge); }

ThanksImg質問者からのお礼コメント

ありがとうございます。こんな方法があったんですね・・・ これなら安全にデータを渡せますね。納得です。 他の方も貴重な意見をいただきありがとうございました。

お礼日時:2012/1/29 20:52

その他の回答(2件)

0

->構造体などのいくつもデータをもっているものであると、値渡しではコピーをしてしまうので処理速度に影響を及ぼすのではないかと思っています。 ->逆に参照渡しだと何かしらのコーディングミスで値を書き換えてしまう危険性云々・・・です。 質問にあるとおり、お互いメリット・デメリットはあるので状況によって使い分けたほうがいいと思います。 処理効率を意識するのであればできるだけ参照渡しやポインター渡しでやったほうがいいと思います。 ただし、実引数の値をかえずに関数内で仮引数の値を変える場合は値渡しでやらないといけません。 この場合、関数内で変数を宣言してそれに構造体(仮引数)のメンバーの値を入れて使用すれば参照渡しやポインター渡しでもできます。 参照渡しやポインター渡しでやる場合、ひとつのメンバーだけかえるのであればそれでいいと思いますが、複数のメンバーをかえるのであればその分関数内での変数宣言が必要になるので値渡しでもいいのではということになります。 そのあたりは状況により使い分けるべきだと思います。 上記に書いたことは一例ですので参考程度に解釈してください。

0

すんませんがゲームを作った事はありません。 参照渡しです。 処理速度に影響を及ぼすと言うか、まずは値渡しに意味があるかないかで判断すべきではないでしょうか。 >>逆に参照渡しだと何かしらのコーディングミスで値を書き換えてしまう危険性云々 「危険性云々」は正確ではなく、参照渡しにすると危険なのはそれ以外にないのではないですか。 表現があいまいな質問は質問者の技術力向上の邪魔になるため避けた方がよいと思います。 ちなみにインデックス破壊の防止ですか・・・うーん、何回も静的にチェックしなおす事くらいしか防止策はないですね。 参考になれば幸いです。