Занимает ли имя переменной в любом языке программирования место в памяти

например

int a=3;//-----------------------(1)

и

int a_long_variable_name_used_instead_of_small_one=3;//-------------(2)

из (1) и (2), которые приобретут больше пространства памяти или равное пространство будет приобретено?

10 ответов


оба занимают одинаковый объем памяти. Имена переменных предназначены только для того, чтобы помочь вам, программисту, запомнить, для чего предназначена переменная, и помочь компилятору связать различные виды использования одной и той же переменной. За исключением отладочных символов, они не отображаются в скомпилированном коде.


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

в интерпретируемых языках и скомпилированных языках, которые обеспечивают интроспекцию/отражение времени выполнения, имя может занимать больше места.

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


в большинстве интерпретируемых языков имя будет храниться в таблице где-то в памяти, занимая, таким образом, разное пространство.


имя переменной в C/C++ не повлияет на размер получаемого исполняемого кода. Когда вы объявляете такую переменную, компилятор резервы пространство памяти (в случае int на x86/x64, четыре байта) для хранения значения. Для доступа или изменения значения он будет использовать адрес, а не имя переменной (которое теряется в процессе компиляции).


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


Для C++,

$ cat name.cpp
int main() {
    int a = 74678;
    int bcdefghijklmnopqrstuvwxyz = 5664;
}
$ g++ -S name.cpp
$ cat name.s
        .file   "name.cpp"
        .text
        .align 2
.globl main
        .type   main, @function
main:
.LFB2:
        pushl   %ebp
.LCFI0:
        movl    %esp, %ebp
.LCFI1:
        subl    , %esp
.LCFI2:
        andl    $-16, %esp
        movl    , %eax
        addl    , %eax
        addl    , %eax
        shrl    , %eax
        sall    , %eax
        subl    %eax, %esp
        movl    678, -4(%ebp)
        movl    64, -8(%ebp)
        movl    , %eax
        leave
        ret
.LFE2:
        .size   main, .-main
        .section        .note.GNU-stack,"",@progbits
        .ident  "GCC: (GNU) 3.4.6 20060404 (Red Hat 3.4.6-11.0.1)"
$ 

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


но имена переменных являются огромными вкладчиками в дизайн программы. Некоторые программисты даже полагаются на хорошие соглашения об именах вместо комментариев, чтобы объяснить дизайн своей программы.

соответствующая цитата из хакер Новости,

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

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


в современных компиляторах имя переменной не влияет на объем пространства, необходимый для ее хранения в C++.


имена полей (имена переменных экземпляра) в Java используют память, но только один раз на поле. Это для того, чтобы рефлексия работала. То же самое касается других языков, основанных на JVM, и я думаю, для DotNet.


нет.. Оба будут занимать равное пространство..


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