関数の引数
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/03/16 13:58 UTC 版)
「マスク (情報工学)」の記事における「関数の引数」の解説
C言語のようなプログラミング言語では、ビットマスクは関数のブーリアン型の引数を一連の名前付きの値として渡すのに使える。例えば、グラフィックスAPIであるOpenGLには、glClear() というコマンドがある。これは画面や他のバッファをクリアするもので、4つのバッファ(color、depth、accumulation、stencil)をクリアできるので、これらを指定するのにブーリアン型の引数を4つ使ったAPIが考えられる。すると、その呼び出しは次のようになる。 glClear(1,1,0,0); // 実際の glClear とは異なる。 これでは、可読性が低く、何をしたいのかわかりにくい。そこで実際には特定ビット位置をオンにしたビットマスクに GL_COLOR_BUFFER_BIT、GL_DEPTH_BUFFER_BIT、GL_ACCUM_BUFFER_BIT、GL_STENCIL_BUFFER_BIT と名前を付け、glClear() を次のように宣言している。 void glClear(GLbitfield bits); すると、この関数の呼び出しは次のようになる。 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); このような引数を持つ関数の内部では、個々のビットを取出すのに AND 演算を行っている。例えば、glClear() の実装は次のようになる。 void glClear(GLbitfield bits) { if (bits & GL_COLOR_BUFFER_BIT) { // color バッファをクリア } if (bits & GL_DEPTH_BUFFER_BIT) { // depth バッファをクリア } if (bits & GL_ACCUM_BUFFER_BIT) { // accumulation バッファをクリア } if (bits & GL_STENCIL_BUFFER_BIT) { // stencil バッファをクリア }} この手法の利点は、引数の個数を削減することでオーバーヘッドを削減できる点である。データとして受け渡しできる最小単位は1バイトなので、それぞれの操作を別々の引数で受け渡すと、引数当たり7ビットが無駄となり、余分なスタック領域を占有することになる。実際には引数は32ビットの整数であることが多く、その場合は32個のオプションを1つの引数で指定できる。しかし、この手法を単純に実装すると型安全ではなくなる。GLbitfield は単純に unsigned int で定義されているので、コンパイラは glClear(42) や glClear(GL_POINTS) といった無意味な呼び出しがあってもエラーを検出できない。C++では、glClear が受け取る引数群をクラスとしてカプセル化でき、型安全性を保証できる(外部リンク参照)。
※この「関数の引数」の解説は、「マスク (情報工学)」の解説の一部です。
「関数の引数」を含む「マスク (情報工学)」の記事については、「マスク (情報工学)」の概要を参照ください。
- 関数の引数のページへのリンク