
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
Cのオブジェクトファイルの逆アセンブル
C言語・C++・C#
-
int16_t の _t は何?
C言語・C++・C#
-
大量のデータを読み込んで表示する速度を改善したい
C言語・C++・C#
-
-
4
プログラミング 素数か素数ではないか判断するプログラミングで、写真のようなプログラミングを打ったとき
C言語・C++・C#
-
5
アセンブラ指令
C言語・C++・C#
-
6
Cの関数の引数のconst *charについて
C言語・C++・C#
-
7
変数のスコープ
C言語・C++・C#
-
8
C言語でファクト関数を使わずに階乗を計算する方法はありますか?できれば教えてください
C言語・C++・C#
-
9
Cのdoubleの浮動小数点表示について
C言語・C++・C#
-
10
スタックフレームの消滅
C言語・C++・C#
-
11
いまc言語の標準ライブラリ文字列を勉強しているのですがいまいちわかりません。 strcmpとmemc
C言語・C++・C#
-
12
c言語の問題の説明、各所ごとに
C言語・C++・C#
-
13
マクロ関数 #define の効果は何ですか? わかりやすく教えて下さい
C言語・C++・C#
-
14
c言語
C言語・C++・C#
-
15
プログラミング 2つの整数を読み込んで、等しければ 「二つの値は同じです」と表示し、そうでなければ,
C言語・C++・C#
-
16
C言語 1から20までの逆数の和を求めたいのですが、このようにプログラミングしたら値が負になってしま
C言語・C++・C#
-
17
いまc言語を独学で勉強しているのですがいまいちわかりません。 https://monozukuri-
C言語・C++・C#
-
18
C言語の質問です。バイナリ形式で保存されたWindows Bitmap形式の画像ファイルを読み込み、
C言語・C++・C#
-
19
Cのコンパイルでコメントアウトをそのままオブジェクトに保持したい
C言語・C++・C#
-
20
プログラミング 2つの整数を読み込んで、等しければ 「二つの値は同じです」と表示し、そうでなければ,
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
C言語のポインタに直接アドレス...
-
LPSTR型の初期化について
-
戻り値で構造体を返すことは可...
-
ハンドルはポインタか
-
ハンドル、アドレス、ポインタ...
-
アプリを32bitから64bit移行
-
IEコンポーネント(CWebBrowser2...
-
参照型で受け取った引数をポイ...
-
関数ポインタの高速化のメリット
-
init関数の意味
-
ポインタ変数のインクリメント
-
メモリのアドレスからの値の取...
-
エラーの意味
-
ダイアログから、ドキュメント...
-
AESのC言語による実装
-
プーさんのマウスポインタを教...
-
c言語のポインタについて初心者...
-
プログラミングのfarについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
戻り値で構造体を返すことは可...
-
Run-Time Check Failure #3とい...
-
参照型で受け取った引数をポイ...
-
LPSTR型の初期化について
-
C言語でのconstを返す関数
-
アプリを32bitから64bit移行
-
ExcelVBAでのkernel32(64bit)
-
構造体の中の構造体
-
Cで作成したDLL関数をVBから呼...
-
ハンドルはポインタか
-
c言語で任意のファイルから読み...
-
関数ポインタの高速化のメリット
-
【なぜポインタを使うのか】
-
ハンドル、アドレス、ポインタ...
-
コンストラクタでnewを失敗した...
-
基本アルゴリズムの『返す』の...
おすすめ情報
構造体の引数の渡し方のように、配列の引数の渡し方で配列の中身そのものを
値渡しでコピーして渡せるような書き方ってあるのでしょうか?
関数そのものを引数として値渡しでコピーして渡すような書き方ってあるのでしょうか?