Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Объем переменной


Автор: AlexJohnson 31.3.2009, 08:59
Всем привет!
Возможно вопрос не касается именно языка с++, но все же:
Вот многие знаю что тип int занимает в памяти 4 байта (если я сам не ошибаюсь), а как дело обстоит с именем переменной оно же может быть очень большым, например:

Код

int dfnsdonskjfnsodfnmsdokfnsdokfns_dokfsdnfmoksoksndfsdfnsodjnobjnv = 100;


Сколько "места" занимает имя переменной в памяти или оно хранится где-то еще???

Автор: GoldFinch 31.3.2009, 09:01
нигде не хранится

Автор: AlexJohnson 31.3.2009, 09:08
Цитата

нигде не хранится


Ммм... а как тогда компилятор понимает что надо "взять" ту или инную переменную??

Автор: InvalidProperty 31.3.2009, 09:15
по ее адресу

Автор: GoldFinch 31.3.2009, 09:17
во время компиляции хранится, в скомпилированном бинарнике (.ехе) не хранится...

Автор: azesmcar 31.3.2009, 09:20
Цитата

Вот многие знаю что тип int занимает в памяти 4 байта 


я такого не знаю smile на многих платформах он занимает 4 байта, но гарантии тут нету.

Цитата

Ммм... а как тогда компилятор понимает что надо "взять" ту или инную переменную?? 

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

Автор: AlexJohnson 31.3.2009, 09:29
azesmcar, спасибо.

Цитата

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


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

+ покурить в сторону:

Цитата

Почитай теорию компиляторов, много полезного узнаешь.

Автор: azesmcar 31.3.2009, 09:31
Цитата

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


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

Автор: AlexJohnson 31.3.2009, 09:35
Цитата

В машинном коде переменных нет, там есть адреса


Аааа... вот оно что!  smile 

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

2 azesmcar, а можеш что-то продемонстрировать мне на машинном языке какой-нибудь код, прошу прощения за  smile !

Всем спасибо!

Автор: Ofer 31.3.2009, 09:37
Цитата(AlexJohnson @  31.3.2009,  09:29 Найти цитируемый пост)
Исходя из того что ты сказал можно ли считать, что вцелом объем занимемого места в памяти перемнной будет сумма длины имени переменной  в байтах + количествой байт занимаемой переменной значением?


Нет. В скомпилированном exe файле имена переменных не сохраняются. То есть переменные

Код

int i = 0;
int peremennaja_s_dlinnum_imenem = 12345;


имеют одинаковый размер.

Добавлено через 2 минуты и 45 секунд
Вот машинный код smile

Код

:100000000C94AA000C94190E0C9429010C94C700AE
:100010000C94C7000C94C7000C94C7000C94C70044
:100020000C94C7000C94C7000C94C7000C94D8061D
:100030000C94C7000C94640C0C94C7000C94C7007B
:100040000C94C7000C94C7000C94C7000C94C70014
:100050000C94C700000102030405060708090A0BF7
:100060000C0D0E0F101112131415161718191A1B58
:100070001C1D1E1F202122232425262728292A2B48
:100080002C2D2E2F303132333435363738393A3B38
:100090003C3D3E3F404142434445464748494A4B28
:1000A0004C4D4E4F505152535455565758595A5B18
:1000B0002F5D5E5F606162636465666768696A6B35
:1000C0006C6D6E6F707172737475767778797A7BF8
:1000D0007C7D7E7F41A042A1E045A3A4A5A64BA7BD
:1000E0004D484FA8504354A9AA58E1ABACE2ADAE7D
:1000F000ADAFB0B161B2B3B4E365B6B7B8B9BABB2E
:10010000BCBD6FBEF8F8F85DFDFDFD5F5FFD5D5F96
:100110006161615F60FAF9FC2DFBFCFC605EFAF93D
:10012000FC2DFBFAFAF9F960605E5EFBFB615E2074
:10013000202020207063BF79E478E5C0C1E6C2C307
:10014000C4C5C6C74500000102032020DFE7FDC883
:10015000C920202011241FBECFE5D8E0DEBFCDBFCF
:1001600011E0A0E6B0E0E0EFF3E202C005900D92EE
:10017000A63CB107D9F713E0A6ECB1E001C01D928F

Автор: Rififi 31.3.2009, 09:40
AlexJohnson, 

... что-то продемонстрировать мне на машинном языке ...

Код
4АхгVХ╗ГЕч╨·Z~Ak┐shхu;М╓║:][:nl№╔
║▀%фЬ╖#╚юAу6шU|F╖d4щd╖*эM~║╫▒35ор&∙ые
жиОг iwиЇ%Ї┐Bu&╘Ї╪`LНА╟ЇW+cтч
йx╪╢ёPOh╜ыэ┐╣g'VW}n#Y_э{рuqt{4ч
╩qпz▄х3╓7-юаОAp ;цё╝знO[▒З~9eC╗┐╖K2}ф
XZ┬їР>VдS╣╬мщФp5┌Ч╨┌Бмr6ху ь[ЙсзМШп
ькsПЄТ╘&ёТд]QO╜OДЕw═╘нр.qэ h x╓

Автор: azesmcar 31.3.2009, 09:41
Цитата

2 azesmcar, а можеш что-то продемонстрировать мне на машинном языке какой-нибудь код, прошу прощения за  smile !

 smile
Код

001110101101001010001101101011001100001110101101001010001101101011001100
010110100101000110110101100110000111010110100101000110110101100110011101
010010100011011010110011000011101011010010100011011010110011001110110001


правда не знаю что он делает  smile могу на ассемблере, это почти машинный код
Код

mov         eax,dword ptr [ebp-14h] 
add         eax,48h 
mov         ecx,dword ptr [ebp-14h] 
add         ecx,64h 
mov         dword ptr [ebp-13Ch],ecx 
mov         dword ptr [ebp-13Ch],0 
mov         edx,dword ptr [ebp-13Ch] 
push        edx  
mov         ecx,dword ptr [ebp-14h] 
mov         ecx,eax 


Автор: AlexJohnson 31.3.2009, 09:50
Код

mov         eax,dword ptr [ebp-14h] 
add         eax,48h 
mov         ecx,dword ptr [ebp-14h] 
add         ecx,64h 
mov         dword ptr [ebp-13Ch],ecx 
mov         dword ptr [ebp-13Ch],0 
mov         edx,dword ptr [ebp-13Ch] 
push        edx  
mov         ecx,dword ptr [ebp-14h] 
mov         ecx,eax 

А как же моя "железяка" (комп) это воспринимает?? Наверно для этого (для меня непонятного) существует свой компилятор. Т.е. реально мне надо курить в сторону компиляторов.

 smile Нашел такое понятие как "автомат", что это???

Автор: Alexeis 31.3.2009, 10:02
AlexJohnson, комп это не воспринимает. Это ассемблер, он транслируется в машинные команды в результате там будет последовательность байтов, которые загрузит процессор и будет интерпретировать своим внутренним интерпретатором в микрокоманды управления регистрами разного назначения, производя все операции в двоичном виде.  

Автор: AlexJohnson 31.3.2009, 10:15
Всем большое спасибо!!

Автор: GoldFinch 31.3.2009, 10:19
исходник sandbox.cpp
Код

#pragma comment(linker,"/ENTRY:main")

int main(void) {
    return 1;
}

скомпилированный файл sandbox.exe, функция main
бинарный код:
B8 01 00 00 00 C3
дизассемблированый код
Код

.text:00401000 B8 01 00 00 00                          mov     eax, 1
.text:00401005 C3                                      retn


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)