2015-01-22 4 views
3

выделить ли компилятор 4 байта памяти при объявлении переменной:Когда пространство памяти выделяется переменной?

int a; 

Или же он выделяет память, когда значение присваивается ему:

a = 5; 

Когда память выделяется? Во время объявления переменной или инициализации?

+1

Какая переменная? Локальный, экземпляр, класс? –

+0

считают, что это локальная переменная. Разные для разных типов? –

+0

yes, локальные примитивы vars живут в стеке, экземпляры классов (объекты) в куче (их ссылка - locals -> on stack). – PeterMmm

ответ

6

Эта переменная выделяется при распределении структуры, содержащей ее.

Для локальной переменной в методе это (с некоторыми оговорками) при вызове метода.

Для статической переменной это когда класс инициализируется (что происходит через некоторое время после его загрузки и до его первого использования).

Для переменной экземпляра это при создании экземпляра.

+0

Благодаря четкой концепции +1, пожалуйста, укажите любую ссылку, если вам нужно изучить управление памятью. –

+0

http://docs.oracle.com/javase/specs/jvms/se7/html/ –

+0

Спасибо, Горячие Лики –

2

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

Короткий анекдот ...

Язык программирования C используется для требуют, чтобы все переменные, используемые в методе объявляются в верхней части метода. Это связано с тем, что компиляторы использовали для резервирования хранилища для всех стековых (локальных) переменных в методе, как только вы ввели этот метод. Сегодня это требование не существует частично потому, что компиляторы намного умнее.

Большинство компиляторов C-подобных языков откладывают выделение экземпляров до первого использования для оптимизированного кода. ДЕЙСТВИТЕЛЬНО сложная вещь заключается в том, что первое использование может быть не таким, как вы думаете, и это может не произойти вообще. Например, если у вас есть следующий код:

int foo(int x) { 
    int y = 5; 
    if (x > 5) 
    y += x; 
    return y; 
} 

Вы можете подумать, что первое использование при назначении 5 у, но компилятор может оптимизировать этот код на что-то подобное:

int foo(int x) { 
    if (x > 5) 
    return 5 + x; 
    return 5; 
} 

В этом коде y никогда не существует вообще.

TL; DR - Компилятор фактически не гарантирует выделение памяти при объявлении или использовании. Доверяйте компилятору, он (обычно) умнее всех.

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