2010-06-26 6 views

ответ

3

Это означает, что все данные для объекта выделяется в стеке, и будет выталкивается, когда текущий метод завершается.

Альтернатива (которая встречается на C# и Java, или если вы используете указатель на C++) должна иметь ссылку или указатель на стек, который ссылается на данные объекта, которые выделяются в куче.

Я думаю, что «встроенный» здесь означает «как часть рамки стека для этого метода», в отличие от существующего отдельно от метода.

2

Ну, вы знаете, что такое стек, не так ли? Если вы объявляете функцию, скажем, C:

int foo() { 
    int bar = 42; 
    return bar; 
} 

Когда функция вызывается, некоторое пространство создается для получения информации о функции в стеке, а число bar выделяется там. Когда функция возвращается, все в этом фрейме стека освобождается.

Теперь в C++:

class A { 
    int a; 
    int b; 
    A(int x, int y) { 
     a = x; 
     b = y; 
    } 
    ~A() { // destructor 
     cout << "A(" << a << "," << b << ") being deleted!" << endl; 
    } 
} 

void foo() { 
    A on_the_stack(1,2); 
    A *on_the_heap = new A(3,4);   
} 

В таких языках, как Java, все объекты выделяются в куче (если компилятор не делает какой-то оптимизации). Но на некоторых языках, таких как C++, объекты класса могут идти прямо в стек так же, как int s или float s. Память из кучи не используется, если вы явно не назовете new. Обратите внимание, что наш объект on_the_heap никогда не освобождается (вызывая на нем delete), поэтому он вызывает утечку памяти. С другой стороны, объект on_the_stack автоматически освобождается при возврате функции и будет иметь свой деструктор, вызванный до этого.