Cで以下の様な関数ポインタテーブル
int (*a[2])(int, int)
を使うメリットとして、処理を高速化できるというメリットの説明として、
「関数に引数を渡す場合、100MB程度の配列を引数にした場合、仮引数のコピーするのに多大な
時間がかかってしまいます。しかし、ポインタを使えば先頭のアドレスを渡すだけなので、コピーの
時間が省けます。少しでも処理を速くしたい場合などによく用いられます。」
とあるのですが、
引数の配列を参照渡しで渡すというのなら意味が分かるのですが、関数ポインタとして処理が高速化
できるという上記の説明が納得できません。どういったシチュエーションのことを言っているので
しょうか?分かる方、御教示願えたらと思います。
No.1ベストアンサー
- 回答日時:
その説明は、どう読んでも「ポインタでの値渡し(≒参照渡し)」の話で、「関数へのポインタ」の話ではありません。
ちなみに
> 100MB程度の配列を引数にした場合
という説明もちょっと違っていて。
int func(char a[100000000]) {
〜
}
int main(){
char a[100000000];
func(a);
}
みたいなことを想定しているのでしょうが。
・ 関数宣言で、仮引数に配列を指定すると、ポインタを指定したのと同じことになる。
int func(char a[100000000]) { → int func(char *a) {
・関数呼び出して、引数の配列を指定した場合、それは配列の先頭要素へのポインタとして扱われる
func(a); → func(&(a[0]));
と、a[100000000]全体をコピーするような状況は発生しません。
「関数に引数を渡す場合、100MB程度の構造体を引数にした場合、仮引数のコピーするのに多大な時間がかかってしまいます。
しかし、ポインタを使えば先頭のアドレスを渡すだけなので、コピーの時間が省けます。
少しでも処理を速くしたい場合などによく用いられます。」
なら、(構造体を引数に使うとコピーが作られるから)説明通りです。
No.7
- 回答日時:
「関数そのものを引数として値渡しでコピーして渡す」というのがどのような動作を想定しているのかわからんのだけど, 「関数そのもの」はそもそも「値」ではないのでその「値渡し」は不可能. なにをどうやってもダメ.
どういう動作を期待しているのかさっぱりわからんけど.
No.6
- 回答日時:
> 構造体の引数の渡し方のように、配列の引数の渡し方で配列の中身そのものを値渡しでコピーして渡せるような書き方ってあるのでしょうか?
無くはない。(十分なサイズの構造体を使う 等)
ただ、そこまでやらなければならない理由は無いと思う。
コピーが必要なら呼ばれた関数の中でコピーすればいい。
No.5
- 回答日時:
まず余談から.
#4 で挙げられた URL にある「関数ポインタの配列を使って高速化」のところで「switch を if の羅列として解釈する」って書いてあるけど, 実際の処理系においてどのようにするかは処理系による. つまり「C の規格上そのように解釈しなければならない」というわけではない. 結果的に「規格で規定された動作」をすればどのように解釈してもよく, あのような場合では実際にジャンプテーブルに変換する処理系も存在するよ.
で「配列の引数の渡し方で配列の中身そのものを値渡しでコピーして渡せるような書き方」については, 直接渡すことはできないので
配列をメンバーにする構造体を使って値渡しする
という方法でエミュレートする. C だと規格上それしかないはず.
No.4
- 回答日時:
関数ポインタテーブルで処理を高速化できるというメリットの「説明」
なら、switch~case文の
http://www.eonet.ne.jp/~nao2/c/c_elegant.htm
かしら。
質問者さんの引用されている「説明」は、
関数ポインタテーブルとは別の内容に関する説明
と思います。
No.3
- 回答日時:
その説明自体は間違っているので、
・説明を書いた人がよくわかっていない
・その書籍かサイトかの編集のミス(あるいは、あなたの読解ミス)で、「これの説明はこうだ」と言う関係が間違っている(別の件の説明)
のどちらかです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語 配列とポインタについて 2 2022/06/02 11:53
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/6】 西暦2100年、小学生のなりたい職業ランキング
- ・ちょっと先の未来クイズ第5問
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fopne で失敗する原因
-
C言語のポインタに直接アドレス...
-
c言語で任意のファイルから読み...
-
エラーの意味
-
Cで作成したDLL関数をVBから呼...
-
ExcelVBAでのkernel32(64bit)
-
C言語のバグの警告文について
-
スコープ外でのアドレスの参照...
-
C言語 ポインタと配列の違い...
-
戻り値で構造体を返すことは可...
-
C++ Builderでのnewコマンドに...
-
関数ポインタの高速化のメリット
-
init関数の意味
-
x64プログラムでアドレスが32bi...
-
どうしてエラーになるかわかり...
-
アプリを32bitから64bit移行
-
C言語、配列とポインタとアスタ...
-
[C言語] NULLは必ず0(番地)です...
-
C言語 配列の長さの上限
-
C# DataGridView のヘッダーセ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
ExcelVBAでのkernel32(64bit)
-
C言語でのconstを返す関数
-
LPSTR型の初期化について
-
参照型で受け取った引数をポイ...
-
ハンドルはポインタか
-
ハンドル、アドレス、ポインタ...
-
CImage GetBitsメソッドについて
-
C++で関数ポインタから関数名を...
-
Cで作成したDLL関数をVBから呼...
-
アプリを32bitから64bit移行
-
コンストラクタでnewを失敗した...
-
TCHAR文字列内の検索について
-
c言語で任意のファイルから読み...
-
デバイスハンドルとは?
おすすめ情報
構造体の引数の渡し方のように、配列の引数の渡し方で配列の中身そのものを
値渡しでコピーして渡せるような書き方ってあるのでしょうか?
関数そのものを引数として値渡しでコピーして渡すような書き方ってあるのでしょうか?