2016-11-09 2 views
0

Что происходит с переменными внутри этой функции?Что происходит с переменными внутри?

void function() 
{ 
    int a = 5; 
    a += a; //a contain 10 
} 

int main() 
{ 
    function(); 
    return 0; 
} 

так, что здесь произошло после того, как функции (функция()) выполнение осуществляется ли эта переменная (а) он все еще находится в памяти (используется память) с последним значением, которое является (10) или его уничтожили полностью и уже не в памяти?

+0

a будет разрушен сразу после возврата функции – Raindrop7

+0

'a' существует только внутри функции. Он возникает каждый раз, когда функция вызывается, и выходит из существования каждый раз, когда она выходит. – StoryTeller

+0

читать о разрешении области: авто и статические и глобальные – Raindrop7

ответ

2

Это не указано. Сначала я опишу наивный случай, а затем объясню, почему он может не применяться.

Наивно, память a была сохранена в еще существующем состоянии, хотя имя a уже недоступно за пределами function. Память может содержать или не содержать 10 - компилятор может ее перезаписать или не беспокоить. Очевидно, что его также можно повторно использовать как что-то еще в любое время.

Если aбыл действительно выделяется в памяти, что может быть в регионе, известном как стек(вызов), но это только популярное соглашение о вызове и не требует языка.

Теперь компилятор волен также хранить a только в реестре, так как он замечает, адрес никогда не принимается, в этом случае он никогда не был в памяти в традиционном смысле этого слова.

Компилятор также может свободно замечать, что a никогда не используется вообще, и не беспокоить, излучая какой-либо код внутри function.

2

Это обычно хранится в стеке, то есть он автоматически выделяется, и память для этих автоматических распределений получает рециркуляцию для каждого вызова функции. Ваш компилятор может решить, что эта переменная на самом деле бесполезна и полностью игнорирует ее, поскольку она никогда не используется и не влияет на другие части вашего кода, так что может случиться так: Nothing.

В C и C++ важно помнить, что существует большая разница между локальными переменными, которые считаются автоматически распределенными и выживают только до тех пор, пока функция выполняет, и динамически распределяются через указатели и new, которые выживают до они либо удаляются с delete, либо программа завершается.

+4

Пожалуйста, используйте автоматическую (стек) и динамическую (кучу) при разговоре о продолжительности хранения. стек и куча являются лишь обычными реализациями. – NathanOliver

+0

Добро пожаловать в автоматический переполнение, я думаю! – tadman

+0

@tadman, милый. Но «автоматическая длительность хранения» будет по-прежнему правильной, если совместные подпрограммы будут введены в C++. «Стек» не обязательно будет. – StoryTeller

0

Когда функция заканчивает все ее локальные переменные, по существу исчезают (точнее, они исчезают, когда заканчивается их блок).

Говоря об их «последнем значении», оставшемся «в памяти», является довольно бессмысленным упражнением, поскольку существует вероятность того, что их значение никогда не было в памяти в первую очередь. И даже если это так, нет никакой гарантии, что он все еще существует или что эта память по-прежнему доступна в любом смысле.

Смежные вопросы