2010-05-21 3 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

을 보라 => "의" –

+0

참고 "그건"은 "__asm의 INT의 3H는"디버그에가는 사람들을위한 것입니다, 거기 스택 "매우를 볼 수 있습니다 ... 올리 - 디버거 말 분명히". – Poni

+0

Haha Konrad - 글쎄, 모두들 - 내가 그걸 포기 했으므로 문법 기술을 검토/개선하지 마라. (: – Poni

답변

8

미안하지만, 그런 종류의 일을하는 것보다 alloca를 사용하는 것이 좋습니다. x86에만 국한되지는 않을뿐만 아니라, 최적화 된 상태로 컴파일하면 예상치 못한 결과가 나타날 수 있습니다.

alloca는 많은 컴파일러에서 지원되므로 언제든지 문제가 발생하지 않아야합니다.

+0

확인을 통해 나는 아직 alloca를 지원하지 않는 컴파일러를 사용하고 있습니다. 일부는 철자를 다르게 지정하지만, 이것은 #define으로 해결할 수 있습니다. (즉, 여러 컴파일러를 사용했지만 사용 가능한 모든 컴파일러를 사용하지는 않았습니다.) –

1

deallocate_from_stack을 정의하지 마십시오. 구현 된대로 deallocate_from_stack으로 즉각적으로이라고 부르면 allocate_from_stack 이후에만 예상대로 작동하며 아마도 그렇지 않을 수도 있습니다. 또한 스택 할당의 전체적인 점은 free 또는 이와 동등한 번호를 호출하지 않아도된다는 것입니다.

allocate 매크로는 괜찮은 것처럼 보이지만 다른 사람은 x86에서 작동한다는 점에 유의해야하지만 ("모든 종류의 CPU"에 대한 걱정이됩니다).

3

귀하의 솔루션은 alloca보다 플랫폼 의존적입니다 (x64에서는 작동하지 않음). 메모리를 할당하기위한 표준 준수 및 매우 빠른 방법이 있습니다. 대규모 메모리 블록을 미리 할당하고 직접 메모리 할당을 관리 할 수 ​​있습니다. Boost Pool Library