プロが教えるわが家の防犯対策術!

Cで以下の様な関数ポインタテーブル
int (*a[2])(int, int)
を使うメリットとして、処理を高速化できるというメリットの説明として、

「関数に引数を渡す場合、100MB程度の配列を引数にした場合、仮引数のコピーするのに多大な
時間がかかってしまいます。しかし、ポインタを使えば先頭のアドレスを渡すだけなので、コピーの
時間が省けます。少しでも処理を速くしたい場合などによく用いられます。」

とあるのですが、
引数の配列を参照渡しで渡すというのなら意味が分かるのですが、関数ポインタとして処理が高速化
できるという上記の説明が納得できません。どういったシチュエーションのことを言っているので
しょうか?分かる方、御教示願えたらと思います。

質問者からの補足コメント

  • 構造体の引数の渡し方のように、配列の引数の渡し方で配列の中身そのものを
    値渡しでコピーして渡せるような書き方ってあるのでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/05/06 09:17
  • 関数そのものを引数として値渡しでコピーして渡すような書き方ってあるのでしょうか?

    No.6の回答に寄せられた補足コメントです。 補足日時:2023/05/06 18:45

A 回答 (7件)

その説明は、どう読んでも「ポインタでの値渡し(≒参照渡し)」の話で、「関数へのポインタ」の話ではありません。




ちなみに
> 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程度の構造体を引数にした場合、仮引数のコピーするのに多大な時間がかかってしまいます。
しかし、ポインタを使えば先頭のアドレスを渡すだけなので、コピーの時間が省けます。
少しでも処理を速くしたい場合などによく用いられます。」
なら、(構造体を引数に使うとコピーが作られるから)説明通りです。
この回答への補足あり
    • good
    • 0

「関数そのものを引数として値渡しでコピーして渡す」というのがどのような動作を想定しているのかわからんのだけど, 「関数そのもの」はそもそも「値」ではないのでその「値渡し」は不可能. なにをどうやってもダメ.



どういう動作を期待しているのかさっぱりわからんけど.
    • good
    • 0

> 構造体の引数の渡し方のように、配列の引数の渡し方で配列の中身そのものを値渡しでコピーして渡せるような書き方ってあるのでしょうか?



無くはない。(十分なサイズの構造体を使う 等)
ただ、そこまでやらなければならない理由は無いと思う。
コピーが必要なら呼ばれた関数の中でコピーすればいい。
この回答への補足あり
    • good
    • 0

まず余談から.



#4 で挙げられた URL にある「関数ポインタの配列を使って高速化」のところで「switch を if の羅列として解釈する」って書いてあるけど, 実際の処理系においてどのようにするかは処理系による. つまり「C の規格上そのように解釈しなければならない」というわけではない. 結果的に「規格で規定された動作」をすればどのように解釈してもよく, あのような場合では実際にジャンプテーブルに変換する処理系も存在するよ.

で「配列の引数の渡し方で配列の中身そのものを値渡しでコピーして渡せるような書き方」については, 直接渡すことはできないので
配列をメンバーにする構造体を使って値渡しする
という方法でエミュレートする. C だと規格上それしかないはず.
    • good
    • 0

関数ポインタテーブルで処理を高速化できるというメリットの「説明」


なら、switch~case文の
http://www.eonet.ne.jp/~nao2/c/c_elegant.htm
かしら。

質問者さんの引用されている「説明」は、
 関数ポインタテーブルとは別の内容に関する説明
と思います。
    • good
    • 0

その説明自体は間違っているので、


・説明を書いた人がよくわかっていない
・その書籍かサイトかの編集のミス(あるいは、あなたの読解ミス)で、「これの説明はこうだ」と言う関係が間違っている(別の件の説明)
のどちらかです。
    • good
    • 0

どこにそう書いてあった?

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!