すべての演算のためのメソッドのテーブルは、該当パッケージのシンボルテーブ
ルに対するマジックとしてキャッシュされます。これは、 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.