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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

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

Q&A

解決済

3回答

2467閲覧

関数の引数で値渡しによるメリット

tuyudaku

総合スコア75

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

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

0グッド

0クリップ

投稿2019/06/28 01:00

シンプルな質問です

関数へ値渡しをすることによる、利点、メリット
値渡しじゃないとダメな状況など、そういうことはあるのでしょうか?

単純に考えたらアドレス、ポインタ、参照渡しの方が
速度的に有利な気がして値渡しを使う理由が分かりません
何か値渡しにメリットはあるのでしょうか?

言語や端末によって話は変わってくるかもしれませんが

とりあえず言語はC/C++としてお願いします。

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

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

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

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

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

guest

回答3

0

その関数の中でその引数をどう操作しようと呼び出しもとの変数には全く影響を与えない、というメリットがあります
そういう保証がないとなると、これから呼び出す関数が引数の値を変えないかどうかいちいちチェックする必要が出てきてやってられなくなりますね

投稿2019/06/28 01:05

y_waiwai

総合スコア87774

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

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

tuyudaku

2019/06/28 01:11

>呼び出しもとの変数には全く影響を与えない、というメリットがあります あぁー、確かにそうですね それは十分なメリットですね! 回答ありがとうございました!
guest

0

ベストアンサー

こんにちは。

C言語には参照がないので、「参照渡し」したい時はポインタを使うしか無く nullチェックが面倒です。
C++では参照があるので該当しませんが。

他にはint型等の基本型を渡す時は、間接参照でないので値渡しの方が一般に高速です。
レジスタに入る程度の小さなクラスなら同様に値渡しした方が高速なケースも若干ありそうです。(処理系にもよりますし、どの処理系でもコンストラクタやデストラクタも呼び出されるのであまりあてにするべきではないですが。)

なお、参照渡しで参照先変数を書き換えたくない時はconst参照を使えば事実上書き換え不可となります。(そのまま書き換えようとするとコンパイラが指摘してくれます。)

投稿2019/06/28 03:44

Chironian

総合スコア23272

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

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

tuyudaku

2019/06/28 05:59

>参照先変数を書き換えたくない時はconst参照を使えば事実上書き換え不可となります const修飾子はあくまでコンパイラに対してエラーを促すだけの単語という考えでいいのでしょうか? constを付け加えることで、内部の処理が変わり、コストが増えたりするなどが 発生することは無いということで大丈夫ですか?
Chironian

2019/06/28 06:59

その通りです!! 更に、最適化に有利になる(書き換えないと宣言するのですから変更されないことを前提に最適化可能)のでより高速なコードが出力されやすくなると思います。
tuyudaku

2019/06/28 07:29

>より高速なコードが出力されやすくなると思います。 なるほど...それはなお更積極的に使っていくべきですね! 回答ありがとうございました!
guest

0

単純に考えたらアドレス、ポインタ、参照渡しの方が

速度的に有利な気がして

intdoubleのようなレジスタに置けるものは、値渡しだとレジスタで渡すことができて速度的に有利です(x64でレジスタが増えましたので、レジスタで渡せる引数の数も増えています)。

投稿2019/06/28 01:09

maisumakun

総合スコア145184

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

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

tuyudaku

2019/06/28 01:14

>intやdoubleのようなレジスタに置けるものは なるほど、一般的な型の場合はそれに限らずといった感じなのですね やはり、クラス・構造体はポインタ、基本型は値渡しというのが基本になるのですかね! 回答ありがとうございました!
maisumakun

2019/06/28 01:22

基本型はともかく、参照型についてデフォルトで「コピーしての値渡し」となる言語は珍しいです(Ruby、Javaなどのように「参照型は参照の値渡しのみ」という言語も存在します)。 PHPは配列が「Copy on Writeでの値渡し(渡された側で書き込んだ時点で、コピーのコストが発生)」となるというように、言語ごとに特殊な背後事情がある例もあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問