石黒/日誌/2013-04-20
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[石黒/日誌]]
*ループカウンタの省略 [#z37c65e1]
たとえば配列の内容を順次出力するような関数を考えるとき、これまでは
void puts(char *a, int length)
{
int i;
for (i = 0; i < length; i++)
putc(a[i]);
}
のようなコードを書いていた。これが組み込みOS本ではたとえば以下のように書く。
void puts(char *a, int length)
{
for (; length > 0; length--)
putc(a[i]);
}
ループカウンタiを省略しているのだ。
以前の書き方でなぜループカウンタを導入していたかというと、自分は''引数は外部から与えられた神聖なもの''という認識があり、関数中ではなるべく変更しないようにしていたからだ。constに近い扱い。値渡しを理解していても、直接変更はしないように書く癖がついてしまった。これはリーダブルコードでも書いてあったような気がする(確認はしてない)。
変数名としても、length=長さという意味が一瞬で失われてしまう。配列内の未処理部分という意味ではremainingとかにするべきかもしれないけれど、"引数でremainingを渡される"というのも文章にすると不自然だし、そもそも一般的に使われてない単語だし。
ただ、リソースが限られた組み込みプログラミングでは、ロジックが明らかである場合は無駄な変数を定義しないほうが良いわけで、後者のコードのようになっていると考えられる。
一応、前者の書き方をしても通常はコンパイラが最適化を施してしまうので結果的には同じようなアセンブリにはなるんだろうけど、組み込みプログラミングだとvolatile変数を使ったり、最適化を避けるように指定するのでコーディングの時点で意識しなければならないようだ。
終了行:
[[石黒/日誌]]
*ループカウンタの省略 [#z37c65e1]
たとえば配列の内容を順次出力するような関数を考えるとき、これまでは
void puts(char *a, int length)
{
int i;
for (i = 0; i < length; i++)
putc(a[i]);
}
のようなコードを書いていた。これが組み込みOS本ではたとえば以下のように書く。
void puts(char *a, int length)
{
for (; length > 0; length--)
putc(a[i]);
}
ループカウンタiを省略しているのだ。
以前の書き方でなぜループカウンタを導入していたかというと、自分は''引数は外部から与えられた神聖なもの''という認識があり、関数中ではなるべく変更しないようにしていたからだ。constに近い扱い。値渡しを理解していても、直接変更はしないように書く癖がついてしまった。これはリーダブルコードでも書いてあったような気がする(確認はしてない)。
変数名としても、length=長さという意味が一瞬で失われてしまう。配列内の未処理部分という意味ではremainingとかにするべきかもしれないけれど、"引数でremainingを渡される"というのも文章にすると不自然だし、そもそも一般的に使われてない単語だし。
ただ、リソースが限られた組み込みプログラミングでは、ロジックが明らかである場合は無駄な変数を定義しないほうが良いわけで、後者のコードのようになっていると考えられる。
一応、前者の書き方をしても通常はコンパイラが最適化を施してしまうので結果的には同じようなアセンブリにはなるんだろうけど、組み込みプログラミングだとvolatile変数を使ったり、最適化を避けるように指定するのでコーディングの時点で意識しなければならないようだ。
ページ名: