VarConv のようなものですが、より高度なカスタム バリアント PhysUnit を作成しています。これは、実数または複素数を使用して、ユニットの加算と減算だけでなく、乗算と除算も可能にします。正常に動作しますが、非常に遅くなります。
問題は、このカスタム バリアントが他のバリアント (integer や double などの単純な型、または VarComplex などの別のカスタム) をラップしているため、DoAdd、DoSubtract を実行するときに、最初に両方のオペランドが同じファミリ (長さなど) を持っているかどうかを確認し、次に必要に応じてそれらの 1 つを変換する量を追加します。
Left:=Left + Right*multiplier;
そのようなもの、ここで Left と Right はバリアントです。
コンパイラは、この行を一連の呼び出しに変換します。
_varCopy(tmp,Left);
_varAdd(tmp,Right*multiplier);
_varClear(Left);
_varCopy(Left,tmp);
_varClear(tmp);
実際には、一時的なバリアントとこれらすべての回避策のためにメモリを割り当て/割り当て解除しなくても、_varAdd で十分です。
残念なことに、_varAdd(Left,Right) と書くことはできません。VCL にリンクされていません。
したがって、問題は、とにかくそれを呼び出して、さまざまなオプションや他のライブラリを追加してコンパイルしたときに変更される可能性のある直接メモリアドレスへの厄介な呼び出しなしで、できるだけ「クリーン」にすることは可能ですか?