3

スタックにメモリを割り当てたい。

_alloca / allocaを聞いたことがありますが、これらはコンパイラ固有のものであり、私は好きではないことを理解しています。

だから、私は自分自身の解決策を思いついた(それはそれ自身の欠陥があるかもしれない)そして私はあなたにそれをレビュー/改善して欲しいので、私たちはこのコードを機能させるでしょう:

/*#define allocate_on_stack(pointer, size) \
    __asm \
    { \
        mov [pointer], esp; \
        sub esp, [size]; \
    }*/
/*#define deallocate_from_stack(size) \
    __asm \
    { \
        add esp, [size]; \
    }*/

void test()
{
    int buff_size = 4 * 2;
    char *buff = 0;

    __asm
    { // allocate
        mov [buff], esp;
        sub esp, [buff_size];
    }

    // playing with the stack-allocated memory
    for(int i = 0; i < buff_size; i++)
        buff[i] = 0x11;

    __asm
    { // deallocate
        add esp, [buff_size];
    }
}

void main()
{
    __asm int 3h;
    test();
}

VC9でコンパイル。

そこにはどんな欠陥がありますか?たとえば、ESPから差し引くことが「あらゆる種類のCPU」の解決策であるかどうかはわかりません。また、コメントアウトしたマクロを動作させたいのですが、どういうわけか動作しません。

4

3 に答える 3

8

申し訳ありませんが、そのようなことをするよりも、アロカを使うほうがよいでしょう。x86固有であるだけでなく、最適化をオンにしてコンパイルすると、予期しない結果が生じる可能性があります。

allocaは多くのコンパイラでサポートされているため、すぐに問題が発生することはありません。

于 2010-05-21T14:39:24.920 に答える
3

あなたのソリューションは、よりもプラットフォームに依存していますalloca(x64 では動作しません)。メモリを割り当てるには、標準に準拠した非常に高速な方法があります。大きなメモリ ブロックを事前に割り当て、自分でメモリ割り当てを管理できます。見てみるBoost Pool Library

于 2010-05-21T15:00:12.373 に答える
1

定義しないでくださいdeallocate_from_stack。実装されているように、 は の直後deallocate_from_stack呼び出された場合にのみ期待どおりのことを行う可能性が高く、そうでない場合もあります。さらに、スタック割り当ての全体的なポイントは、呼び出しまたは同等のものを避けることです。allocate_from_stackfree

割り当てマクロは私には問題ないように見えますが、他の人が指摘しているように、x86でしか機能しないことに注意してください(「あらゆる種類のCPU」に関する懸念は無用です)。

于 2010-05-21T14:43:37.533 に答える