C言語における汎用的な関数、の続き

  • (by K, 2014.10.17)

(0)

  • prog_0001の続きです。
    • 要約すると、関数を一般化するときに、関数のポインタだけでは不十分で、その関数に関するパラメータなどを記録した構造体へのポインタも必要だよね、ということです。

(1)

  • ということで、僕はC言語で関数を渡すのなら、関数へのポインタのほかにカスタマイズ構造体へのポインタも渡すべきだと主張しているのだけど、これをどう渡すのかということに関しては、方法が2つあると思います。
    • (a) fとcustomizeの2つのポインタを渡す
      例: void qsort(base, num, size, compare, customize);
    • (b) fはcustomizeの先頭に格納し、引数としてはcustomizeだけを渡す
      例: void qsort(base, num, size, customize);
  • (a)の方法は単純で分かりやすいけど、ソース上では少々冗長で、ちょっとめんどくさい。バイナリ的にも2つの引数をスタックに積まなくてはいけないので、コードは長くなります。
  • (b)の方法はソース上では短いけれど、実際に関数を呼び出す際にはcustomizeの中にある関数ポインタを取り出さなくてはいけないので、実行速度面で少し余計なコストがかかります(と思う)。

(2)

  • それで、僕としては(a)をお勧めしたいです。なぜなら、それはcustomizeをNULLにできるからです。
  • ぶっちゃけると、customizeを使って関数を修飾したい場合というのはそれほど多くはないです。それは、Cの標準ライブラリでは今まで「関数ポインタのみ版」しか提供されてこなかったほどです。だからこういうメジャーケースでは、customizeをNULLにしたくなります。
  • しかし(b)の方式でいくとなると、とにかく関数ポインタを格納するためだけにcustomizeは必須になるので、ダミーのオブジェクトを作って(まあ実際はただのintな変数でもいいけど)そこにfのポインタを格納しておかなければいけません。
  • そういうことを強制されなくて済む分だけ、(a)のほうがいいかなあと僕は思います。

こめんと欄


コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-10-18 (土) 06:08:45 (3480d)