Занимает ли место в любом языке программирования имя переменной - PullRequest
6 голосов
/ 23 сентября 2010

Например,

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

и

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

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

Ответы [ 10 ]

18 голосов
/ 23 сентября 2010

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

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

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

8 голосов
/ 23 сентября 2010

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

6 голосов
/ 23 сентября 2010

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

5 голосов
/ 23 сентября 2010

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

2 голосов
/ 23 сентября 2010

для 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    $8, %esp
.LCFI2:
        andl    $-16, %esp
        movl    $0, %eax
        addl    $15, %eax
        addl    $15, %eax
        shrl    $4, %eax
        sall    $4, %eax
        subl    %eax, %esp
        movl    $74678, -4(%ebp)
        movl    $5664, -8(%ebp)
        movl    $0, %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 не отражаются на выходе ассемблера. Таким образом, длина имени переменной не имеет значения во время выполнения с точки зрения памяти.


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

Соответствующая цитата из Hacker News ,

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

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

2 голосов
/ 23 сентября 2010

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

1 голос
/ 23 сентября 2010

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

1 голос
/ 23 сентября 2010

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

0 голосов
/ 25 сентября 2010

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

0 голосов
/ 23 сентября 2010

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

...