静的ベース アドレスではなく、動的ベース アドレスを使用してクラスをアドレス指定できるかどうか疑問に思っています。基本的な考え方は次のとおりです。
オブジェクト A を次のように定義します。
class A
{
//member variables
...
//non-virtual member functions
...
//virtual methods
virtual void foo(...);
...
};
このクラスは、スタック オブジェクトとしてインスタンス化できず、標準の new 演算子がありません。
代わりに、オブジェクトには、ベース アドレスとベース アドレスからメモリへのオフセットを取得し、これを使用して構築用の絶対アドレスを計算する配置 new があります。
私がやりたいことは、次のようにコードでオブジェクトにアクセスすることです:
A* clsA=new(base,offset) A();
...
clsA->foo( ... );
どこ
(char*)clsA == (char*)(base+offset)
さらに、次のことを行うことができます
base+=4;
...
clsA->foo( ... );
そしてまだこれがあります:
(char*)clsA == (char*)(base+offset)
真を保持します。
これが C++ で可能かどうかはわかりません。ASM (x86/amd64) で実行できることは知っていますが、できるだけ多くの移植性を備えたソリューションが必要です (これはまだほとんどないことを認識していますが、何もないよりはましです)。助言がありますか?
編集:だから、私が抱えている問題についてあまり明確ではなかったと思います。アイデアは、動的オブジェクト (ヒープに割り当てられたオブジェクト) をメモリ内で移動できるようにすることです。通常、これは問題にはなりませんが、スタック メモリを介してオブジェクトをインスタンス化できないため、オブジェクトにアクセスする唯一の方法は、オブジェクトの基になるメモリへのポインタを使用することです。配列が移動すると (この例では 4 バイト)、配列から借用されたポインターは無効になり、更新する必要があります。このプロセスは時間がかかるだけでなく、私が望むよりも多くのメモリを消費するため、貸し出された各ポインターのエントリを含む再配置テーブルを格納するのではなく、クラスがアクセス時にメモリ アドレスを再計算できるようにしたいと考えています。
この概念を表すアセンブリは次のとおりです。
;rax stores clsA
mov rcx, rax
shr rcx, 32
mov DWORD PTR[rdx], rax
lea rax, rdx+rcx
push rax
call foo
EDIT 2: 結局のところ、この正確なタイプの動作には MSVC 修飾子もあります。__based は、別のポインターに相対的なポインターを宣言するため、基になるメモリを移動でき、ポインターは有効なままです。記事はこちら。