1

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 constcode_

これを回避するにはどうすればよいですか?メンバーフィールドに再割り当てせずに、ローカル構造体変数を呼び出し元から呼び出し元のローカル構造体変数に移動するにはどうすればよいですか?

4

0 に答える 0