eallocator
実行権限でメモリを管理するアロケータがあります。C ++ 11 std::vector
には、std::vector::data()
要素の基になる配列へのポインタを返すメンバー関数があります。いくつかのデータを配列に入れます。bodyを使用して演算子を呼び出すと、実行可能コードとして扱われます。
static_assert(std::is_floating_point< F >::value, "F is not floating-point value type");
F result_;
__asm("call *%1"
: "=&t"(result_)
: "r"(code_.data())
: "memory", "%ax", "%st(1)", "%st(2)", "%st(3)", "%st(4)", "%st(5)", "%st(6)", "%st(7)"
);
return result_;
コード実行の結果を取得します(常に単一の浮動小数点値)。
しかし、たとえば、ある関数からT
のフィールドを含む構造体を返そうとして、それをローカル変数に配置しようとすると、基になるメモリの望ましくない再割り当てが発生します( rip-relativeアドレス指定されたコードのすべてのオフセットに違反します)。std::vector< std::uint8_t, eallocator< std::uint8_t > > code_
T const
code_
これを回避するにはどうすればよいですか?メンバーフィールドに再割り当てせずに、ローカル構造体変数を呼び出し元から呼び出し元のローカル構造体変数に移動するにはどうすればよいですか?