2012-08-13 4 views
7

C(++)(AVR-Gcc)の組み込みシステムでメニューを実装する際に、引数を取るvoid関数ポインタがありました。いくつかのケースではNULLポインタの引数はどれくらいですか?

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

(実際かなりの数に)、関数は、実際の引数を必要としないので、私のようなものだろう:私はちょうどに過負荷になる可能性があり知って

if (something) doAuxFunc(NULL); 

を私は実際には複数のオブジェクトをインスタンス化し、それらを軽く保ちたいので、これをしないようにしています。

NULLポインタを使用して複数の関数を呼び出すと(実際のポインタを意図している場合)、より多くの関数プロトタイプを実装すると悪化しますか?

+6

プロファイラーとは何ですか? – zoul

+2

なぜ過負荷は「重い」と思いますか? –

+0

@KerrekSB主に、これらを保持するオブジェクトが(比較的)多く存在するため、スペースは組み込みシステムにとって貴重です。この場合、メニューはプロジェクトの主な機能の補助的な部分です。 – falro

答えて

9

NULLをチェックすることは、マイクロコントローラであっても非常に小さいオーバーヘッドです.0との比較は、高速であると考えられています。いくつかの関数をオーバーロードすると、パフォーマンスが少し向上するという可読性が失われます。

1

"トレードオフ"はそれぞれのアプローチでは非常に低いと思いますが、これは自分でベンチマークを行う時間です。もしそうなら、いくつかの結果を投稿してください:)

2

チェックは0です。コンパイル時に決定されるので、オーバーロードはさらに安いです。

しかし、インターフェイスが過負荷で複雑すぎると思われ、機能が小さいと思われる場合は、inlineと宣言してヘッダーに挿入する必要があります。その後、0のCheckigは、まともな最新のコンパイラによって簡単に最適化することができます。

+0

これは組み込みシステムのための解決策であるため、インライン展開ではより多くのコードメモリが使用され、この場合は高価になります。 – syplex

+0

@syplex:それは関数呼び出しとクリーンアップのサイズに大きく依存します。インライン展開はスペースを節約できます。これは、妥当なオプティマイザが不要な命令を排除できる場合に特に当てはまります。一般的な単純な例は、FooのBarメンバへの読み取り専用アクセスを提供する 'Foo :: getBar'メソッドです。これは、単純なポインタオフセット計算として終わる可能性があり、他のオフセット計算でも折り返すことができます。 – MSalters

+0

gccに部分的なインライン展開機能が追加されました。基本的には、すべてのパラメータに応じて関数コアを作成し、次に定数を伝播できる部分をインライン化します。これはサイズオーバーヘッドがあまりありません。 –

3

逆アセンブリを見て、最初の引数として渡すにはnullを生成する必要があります。レジスタまたはスタックの場所を焼き込んだり、レジスタを焼き込んだりすると、呼び出し関数はレジスタを枯渇させています。 (呼び出し規約を実装するために関数がレジスタを枯渇させている場合は、関数呼び出しを使用するだけで、プッシュしてポップすることがあります)。

したがって、コストがかかる可能性がありますが、方法を変更するにはコストが足りない可能性があります。

関連する問題