7

C(++) (AVR-Gcc) で組み込みシステムにメニューを実装する際に、引数を取り、通常はそれらを使用する void 関数ポインターになってしまいました。

// void function prototype
void (*auxFunc)(char *);

場合によっては (実際にはかなりの数)、関数は実際には引数を必要としないため、次のようにします。

if (something)    doAuxFunc(NULL);

別の関数型にオーバーロードできることはわかっていますが、複数のオブジェクトをインスタンス化し、それらを軽量に保ちたいため、実際にはこれを行わないようにしています。

NULL ポインターを使用して複数の関数を呼び出すことは (実際のポインターを対象としている場合)、より多くの関数プロトタイプを実装するよりも悪いことですか?

4

4 に答える 4

9

NULLのチェックは、マイクロコントローラー上でも非常に小さなオーバーヘッドです。0との比較は非常に高速であると考えられます。複数の関数をオーバーロードすると、読みやすさが向上し、パフォーマンスが(ごくわずかに)向上します。GCCのオプティマイザにその処理を任せるだけで、かなり上手になります:)

于 2012-08-13T14:50:08.743 に答える
3

逆アセンブリを見てください。最初の引数として渡す null (ゼロ) を生成する必要があります。これは、レジスタまたはスタックの場所を焼き付けます。レジスタを焼き付ける場合、呼び出し元の関数がレジスターに飢えています。(関数呼び出しを使用するだけでは、呼び出し規約を実装するために関数がレジスターに飢えている場合、プッシュとポップのコストがかかる場合があります)。

したがって、コストは発生する可能性がありますが、やり方を変えるには十分なコストではないかもしれません。

于 2012-08-13T17:24:59.637 に答える
2

コンパイル時にどの関数を選択するかが決定されるため、チェック0は非常に安価で、オーバーロードはさらに安価です。

ただし、インターフェイスがオーバーロードによって複雑になりすぎて関数が小さいと思われる場合は、それを宣言しinlineてヘッダーに配置する必要があります。その後、 Checkig for0は、適切な最新のコンパイラーによって簡単に最適化できます。

于 2012-08-13T15:23:49.060 に答える
1

それぞれのアプローチの「トレードオフ」は途方もなく低いと思いますが、今が自分でベンチマークを行うときです。もしそうなら、いくつかの結果を投稿してください:)

于 2012-08-13T14:51:23.833 に答える