2010-05-21 89 views
3

我想在堆棧上分配內存。C++中的動態堆棧分配

聽說_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」的解決方案。 另外,我想使註釋掉的宏能夠工作,但由於某些原因,我無法工作。

+1

「it's」=>「其」 – 2010-05-21 14:33:17

+0

注意:「__asm int 3h」用於那些要調試的人,用Olly-Debugger說...在那裏你可以看到堆棧「非常明確」。 – Poni 2010-05-21 14:35:03

+0

哈哈康拉德 - 嗯,大家 - 請不要複習/提高我的語法技能,因爲我已經放棄了他們(: – Poni 2010-05-21 14:36:31

回答

8

對不起,但你最好使用alloca而不是做那種東西。不僅它是x86特定的,而且如果在優化上進行編譯,它可能會帶來意想不到的結果。

alloca被許多編譯器支持,所以你不應該很快遇到問題。

+0

通過確認,我也沒有使用不支持'alloca'的編譯器,有些拼寫有所不同,但這可以用'#define'解決。 (也就是說,雖然我使用了一些編譯器,但我當然沒有使用過每一個可用的編譯器。) – 2010-05-21 23:37:05

1

不要定義deallocate_from_stack。如實施,deallocate_from_stack將可能只會做你所期望的,如果立即allocate_from_stack後,甚至可能不是那麼。此外,堆疊分配的全部重點是避免必須致電free或任何等效物。

分配宏對我來說看起來不錯,儘管正如其他人指出的那樣,它只能在x86上工作(這讓您對「任何類型的CPU」沒有任何疑問)。

3

您的解決方案比alloca更依賴於平臺(它不適用於x64)。有一個標準兼容和相當快的方式分配內存。您可以預先分配大塊內存並自行管理內存分配。看看Boost Pool Library