はい、わずかな量のクロック サイクルを無駄にしています。を書き込むledChange(LOW)
と、CALL タイプの命令にコンパイルされます (プログラム カウンター レジスタにメソッドの場所にジャンプするように指示します)。
したがって、これは基本的に次のようにコンパイルされます。
- いくつ
LOW
かのレジスタまたはスタックに入れます
- の場所にジャンプ
ledChange()
- メモリからフェッチし、どこか
led
に一緒に置きますLOW
- にジャンプ
digitalWrite()
- 入っているものは何でもする
digitalWrite()
- ジャンプバック
- ジャンプバック
CALL
ジャンプは、スタックをいじることが多く、通常のJMP
命令よりもはるかに時間がかかることに注意してください。
一方、単に実行すると、次のようにdigitalWrite(led,LOW)
なります。
- をメモリのどこかからフェッチし
led
、アクセス可能な場所に配置しますLOW
- にジャンプ
ditigalWrite()
- 入っているものは何でもする
digitalWrite()
- ジャンプバック
対応するコンパイル済みコードで引数がどのように渡されるかは完全にはわかりません。おそらく呼び出しの一部です。また、コンパイラはさまざまであり、一部のコンパイラは他のコンパイラよりも優れていることに注意してください。
関数のカプセル化により、プログラムを実行するたびに、プログラムがより多くのクロックサイクルを消費したことがわかります。ただし、これは最適化する価値はありません。このようなカプセル化には、Arduinoの速度を低下させるほどの容量はありません。その上、私が述べたように、一部のコンパイラはそのようなことを最適化します。
これは、関数が であることとは何の関係もありませんvoid
。それが関数だった場合、戻り値の前に int を格納するにはor スタック操作が必要になるため (どれを忘れたか) int
、処理速度が非常に遅くなります。MV