Rogue Wave バナー
前へマニュアルの先頭へ目次索引次へ

22.1 概要

C++ 言語は、数値配列に対し長く難解な演算を実行する、科学および技術計算によく使用されます。 この言語自体は、この種の計算に必要な柔軟性と効率をすべてを備えていますが、そのコードは非常に複雑になることがあります。当然ながら、言語のオブジェクト指向機能を使用することで、この複雑さをカプセル化することができますが、数値プログラミングを簡易化するために設計されたクラスを、パフォーマンスを低下させずに正しくコーディングすることは困難です。標準 C++ ライブラリは、valarray クラステンプレートによってこれを可能にしています。

このクラステンプレートは、1 次元配列の形で必要な効率を提供します。クラス valarray を使用することで、1 次元の配列に直接的に計算を実行し、高次元の配列をわずかな労力で表示することができます。添字演算子の拡張セットは、比較的単純で低レベルの valarray から、マトリックスやその他の高度なクラスを構築するための基礎となります。

22.1.1 パフォーマンスの問題

効率は、数値プログラミングにとって極めて重要な問題であるため、valarray クラスはさまざまな方法でパフォーマンスの問題に対応しています。

第 1 に valarray は、クラス内の演算を最適化するために、コンパイラの自由度を最大限にして設計しています。これは、主に valarray 内の要素のエイリアシングを防止することによって実現されます。つまり、特定の valarray 内の要素はどれも、通常の配列の場合とまったく同様に、固有の一意のメモリーアドレスに配置されます。これによって、valarray の実装は、デフォルト値を単一の記憶値とする全要素のエイリアシングなど、ある種の最適化を使用できなくなりますが、この損失は、配列の演算を簡易化する有能なオプティマイザの能力によって十分補填されます。

第 2 に、valarray クラスは内部最適化テンプレートを使用して、できる限り効率的なデータコピー方法が使用されることを保証します。この最適化の一部は、エイリアシングの制限によって可能です。

最後に、valarray クラスは、使用される型に一定の条件を課します。これらの制限の大部分はパフォーマンスに無関係で、汎用数値演算を可能にする上で必要とされるものです。ただし、特に初期化の意味から、部分的に最適化を可能にするための制限が少なくとも部分的に 1 つは存在します。これらの制限を以下にまとめます。

22.1.2 型制限

valarray は、次の要求に一致する型 T のみにインスタンス化することができます。

22.1.2.1 型制限に一致するクラス

intlongfloat などの組み込み数値型はすべて、valarray の型要求を明確に満たしています。以下に、条件を満たす最小限クラスの例を挙げます。このクラスは、実際にコンパイラの生成するコンストラクタ、デストラクタ、代入演算子で十分なごく単純なものです。このように、特殊なものはまったく必要ありません。むしろ要求は、特殊性がないという点に従っています。

22.1.2.2 型制限に一致しないクラス

ここで、クラス valarray の型要求に一致しない Num クラスの簡単なバリエーションを検討してみましょう。このクラスの用途次第では valarray で問題とならないこともありますが、デフォルトの作成の後の代入はコピー作成とは異なる状態となるため、これは明らかに要求に違反します。

22.1.3 その他の固有の機能

特定の型に対して定義されていない演算は、その型の valarray には使用できないことに注意してください。たとえば、標準 complex クラステンプレートの場合と同様に、型が順序付き演算を持たない場合、これらの順序付きオペランドはその型の valarray には使用できません。

もう 1 つの重要な機能は、valarray クラスと共に、valarray ヘッダーが複数の補助クラスを定義して、拡張部分集合演算をサポートすることです。これらの補助クラスは slicegsliceslice_arraygslice_arrayindirect_arraymask_array です。これらについては、22.4.2 節以降で説明します。ここでは、slice および gslice が、 Basic Linear Algreba Subprograms (BLAS)などのスライスや生成されたスライスのパラメータを配列で定義することを指摘するにとどめます。残りの補助クラスは、部分集合演算によって返される型を定義します。これらの補助クラスは、公開コンストラクタを持たないため、プログラムによって直接インスタンス化することはできません。

22.1.4 ヘッダーファイル

valarray を使用するプログラムは、valarray ヘッダーファイルをインクルードする必要があります。


前へマニュアルの先頭へ目次索引次へ
Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月