Go to the first, previous, next, last section, table of contents.


多重定義の実装

すべての演算のためのメソッドのテーブルは、該当パッケージのシンボルテーブ ルに対するマジックとしてキャッシュされます。これは、 bless を行な うときにのみ、 %OVERLOAD@ISA の変更を再チェックします。 つまり、動的に変更したいならば、テーブルを更新するために、意味の無い bless を行なう必要があります。

(すべての SV 風のものは、マジックキューを持っており、マジックがキューの エントリになっています。これによって、1 つの変数が、同時に複数のマジック の形式に関ることができるのです。たとえば、環境変数は普段、%ENV マ ジックと「汚染」マジックの2 つの形式を一度に持っています。)

オブジェクトが %OVERLOAD を持つパッケージに属するならば、そのオブ ジェクトには、特別なフラグが用意されます。つまり、多重定義されていない算 術演算を行なうときの、スピードに対する影響は、このフラグのチェックのみで す。

実際、 %OVERLOAD がアクセスされない間は、多重定義可能な演算に対す るオーバヘッドはほとんど無く、ほとんどのプログラムで、認識できるようなパ フォーマスの低下はないはずです。 %OVERLOAD がアクセスされ、その時 の演算が多重定義可能なものであったときにも、対象の引数が %OVERLOAD を持ったパッケージに属していない場合には、オーバヘッド の最小限にする最大限の努力が為されました。疑わしいときには、 %OVERLOAD がある場合と無い場合で、スピードのテストをしてください。 これまでのところ、Perl が最適化を指定してコンパイル場合には、顕著なスピー ドの低下の報告はあがっていません。

%OVERLOAD が存在しないときには、データの大きさには影響しません。

`$a=$b' のようなコピーは、表層的なものです。しかし、 `$b++' の ように、 `$b' (または、 `$a' ) が参照するオブジェクトへの代入 を意味する演算の前に、1 層深度のコピーが行なわれます。この動作は、自分で コピーコンストラクタを定義することによって変更することができます (「コピー コンストラクタ」の項を参照してください)。

明示的にサポートされていないメソッドに対する引数は、定数であることが期待 されます (が、強制はされません)。


Go to the first, previous, next, last section, table of contents.

検索式: