番兵番兵(ばんぺい、英: sentinel)は基地、野営地の出入りを警備する任務に就く兵士を指す。歩哨とも言う。 転じてプログラミング用語としては、データの終了を示すために配置される特殊なデータを指す。番人(ばんにん)とも言う。以下ではこの意味について示す。 実際にはこの用語は、微妙に異なる以下の2つの意味で使われる。
終了を表すための専用の値主に可変長データの終了を識別するために、終了を示す記号として予約された値。 番兵の具体例としては、LISPで無効値を示すNILや、C言語の文字列終端を示すヌル文字(\0)などがある。また、ポインタを扱う言語ではヌルポインタが定義されており、線形リストや木構造などの終端を示すために使われる。
int strcmp(const char s[], const char t[])
{
int i = 0;
while (s[i] != '\0' && t[i] != '\0') {
/* どちらかの文字列に番兵が現れたら終了 */
if (s[i] != t[i]) {
break; /* 不一致箇所を検出したら終了 */
} else {
i++; /* 一致している場合は次の文字へ */
}
}
return s[i] - t[i];
}
実データに出現する値だと、実データなのか終了なのか判断できないため、実データとしては出現しない値を使う必要がある。C言語の コンピュータで可変長データを表現する方法は、末尾に番兵を置く方法と、長さを別途与える方法の2種類に大別できる。 条件判定の数を削減するために置くダミーのデータループの終了条件が複数ある場合に、条件判定の数を削減するために置くダミーのデータ。この意味での番兵を使った最適化技法を番兵法(-ほう)と呼ぶ。 まず、1の語義に近い例を見る。 以下のC言語プログラムは、整数 int selectEdge(int entry, int a[], size_t len)
{
int i;
for (i = len - 1; i >= 0; i--) {
if (a[i] <= entry)
break;
}
return i;
}
このプログラムには、ループ終了判定として int selectEdge(int entry, int a[], size_t len)
{
int i;
for (i = len - 1; ; i--) {
if (a[i] <= entry)
break;
}
return i;
}
番兵法はループ中の条件判断を削減できるため、実行時間の削減が非常に重要な場合によく検討される。1 回の条件判断にかかる時間は短くても、ループで繰り返す場合には大きな差となる場合がある。しかしソース上で終了条件がわかりにくくなる可能性も高く、現代の高速化したコンピュータにおいては必ずしも歓迎される技法ではない。採用にあたっては、その利点・欠点を十分に考慮する必要がある。 関連項目 |