2016-03-05 1 views
-4
void fun(){ 
    int val2 = 0; 
} 
int main(){ 
    int val1 = 0; 
    fun(); 
} 

если &val1 есть 0x7fff55e54a8c, что будет &val2 be? в моей машине это 0x7fff55e549fc, разве это не должно быть 0x7fff55e54a88 или 0x7fff55e54a90? Если нет, что произойдет, если вы вызовете другую функцию в памяти?Выполняла основную функцию и другую функцию, используя одно и то же пространство стека в C++?

+4

Это зависит почти все, что вы не указали. –

+1

Вы не можете положиться ни на что здесь. Если оптимизатор встроит функцию, они почти наверняка разделяют одно и то же пространство стека. Реальный вопрос: зачем вас это волнует? Что вы на самом деле пытаетесь сделать? –

+0

C++ - неправильный язык для вас. Вы действительно хотите писать на ассемблере. –

ответ

1

если &val1 является 0x7fff55e54a8c, что будет &val2 быть?

Невозможно предсказать его в стандартных нормах C++.

Все ваши функции имеют одно и то же пространство стека , если у вас нет локальных переменных потока.

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

В соответствии с стандартными определениями C++ вы не можете принимать определенные адреса.

1

Каждый поток имеет зарезервированное пространство стека, и в вашем случае обе функции работают в одном потоке, поэтому оба используют одно и то же пространство стека.

В Windows по умолчанию с использованием MSVC каждый поток будет выделять 1 МБ для стека, и теперь вот почему эта информация важна.

void func1(); 
int main() 
{ 
    char abusive_stack_usage[900'000]; 

    // we are about to call func1, and we only have 100kb left to use in the stack. 
    func1(); 
} 

void func1() 
{ 
    // here we use more than 100kb, therefore we get a stackoverflow. 
    char abusive_stack_usage[200'000]; 
} 

В следующем примере мы не получаем StackOverflow.

void func1() 
{ 
    //we use 800kb here (available in stack: 200kb) 
    char abusive_stack_usage[800'000]; 

} // we release those 800kb here (available in stack: 1mb) 

void func2() 
{ 
    char abusive_stack_usage[800'000]; 
} 

int main() 
{ 
    // available: 1mb 
    func1(); 

    // available: 1mb 
    func2(); 
} 
Смежные вопросы