|
|
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
Где хранится адрес области памяти, ассоциированной с переменной? Еесть, к примеру, простейшее объявление переменной: int c; Под эту переменную в 32-разрядной архитектуре компилятор выделяет 4 байта памяти. А каким образом он в дальнейшем находит эту область памяти? Скорее всего где-то хранит адрес первого байта (наподобии указателей), ассоциированный с именем переменной. Или как-то по-другому? ЗЫ Только сильно не пинайте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 14:49 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
Изучающий cppГде хранится адрес области памяти, ассоциированной с переменной? Еесть, к примеру, простейшее объявление переменной: int c; Под эту переменную в 32-разрядной архитектуре компилятор выделяет 4 байта памяти. А каким образом он в дальнейшем находит эту область памяти? Скорее всего где-то хранит адрес первого байта (наподобии указателей), ассоциированный с именем переменной. Или как-то по-другому? ЗЫ Только сильно не пинайте Слишком общий вопрос. Для локальной переменной функции, например, - память выделяется в стеке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 15:08 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
на пальцах. Компилятор читает программу Код: plaintext 1. 2. и обрабатывает её по шагам (компилирует): так, объявили переменную i, пусть её адрес в екзешнике будет 8, записал в книжечку так, пишут в переменную i число 2, значит пишу в екзешник команду "записать число 2 по адресу 8" так, увеличивают значение переменной i, пишу в екзешник команду "увеличить число по адресу 8" т.е. два ответа: 1. во время компиляции хранится в служебных таблицах компилятора. 2. во время выполнения скомпилированной программы везде вместо переменной уже адрес. Хотя на практике всё может быть сложнее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 15:08 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
календареведпусть её адрес в екзешнике будет 8 По-моему, автора интересует как раз вопрос "что это за 8 и где оно находится". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 15:10 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
Dihotom календареведпусть её адрес в екзешнике будет 8 По-моему, автора интересует как раз вопрос "что это за 8 и где оно находится". Угу... т.е., я так понимаю, куда-то записывается имя переменной i (ее ascii-код) и этому коду ставится в соответствие адрес области памяти. Может быть это все находится где-то в статической памяти...или стековой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 15:24 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
Изучающий cppУгу... т.е., я так понимаю, куда-то записывается имя переменной i (ее ascii-код) и этому коду ставится в соответствие адрес области памяти. Может быть это все находится где-то в статической памяти...или стековой? Что такое ASCII-код переменной я не знаю. Допустим, у Вас есть код: Код: plaintext 1. 2. 3. 4. 5. 1. Запоминается текущее значение указателя стека (регистр ESP), например, в регистре EBX. 2. Выделяется память в стеке для i, для чего указатель стека (ESP) смещается на 4 байта "вниз". При это переменной i ставится в соответствие смещение относительно исходного состояния стека - 4 байта. 3. Выделяется память в стеке для j, для чего указатель стека (ESP) смещается на 4 байта "вниз". При это переменной j ставится в соответствие смещение относительно исходного состояния стека - 8 байт. 4. По адресу переменной i, получаемому как исходное состояние стека (EBX) минус её смещение (4) записывается значение 2. 5. Восстанавливается исходное состояние стека: значение ESP устанавливается равным EBX. Описан самый простой случай. Знатоки asm меня поправят, если что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 15:40 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
Поправлюсь: Вместо EBX, по-моему, используется EBP. И что более важно - смещение переменной i относительно исходного состояния указателя стека будет 0, а смещение переменной j - 4. Хотя реально тут смещения другие будут - зависит и от наличия параметров функции, и от компилятора, и от способа вызова, короче, от множества факторов. Но, для объяснения - вполне подойдет 0 и 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 15:44 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
>Что такое ASCII-код переменной я не знаю. Имелось в виду ascii-код имени переменной, т.е., к примеру, для i - это 105. >переменной i ставится в соответствие... а где это осуществляется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 16:05 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
Изучающий cppИмелось в виду ascii-код имени переменной, т.е., к примеру, для i - это 105. Нет, ничего такого не делается. Изучающий cppа где это осуществляется? Это делает компилятор. Если Вы посмотрите дизассемблированный код, то увидете, что все обращения к i закодированы как "EBP - 4" (это если бы смещение было, например, 4). Т.е. EBP - 4 - это адрес, а [EBP - 4] - это значение по этому адресу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 16:09 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
DihotomЭто делает компилятор. Если Вы посмотрите дизассемблированный код, то увидете, что все обращения к i закодированы как "EBP - 4" (это если бы смещение было, например, 4). Т.е. EBP - 4 - это адрес, а [EBP - 4] - это значение по этому адресу. Ага, понял! А если это, к примеру: Код: plaintext ЗЫ Сори за назойливость ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 16:14 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
Изучающий срр Ага, понял! А если это, к примеру: Код: plaintext ЗЫ Сори за назойливость Честно говоря, не знаю, как эта память правильно называется :) По смыслу - да. Это некая постоянная область памяти, в которой при загрузке программы сразу же выделяется память в 4 байта. Любое дальнейшее обращение к переменной i компилятор интерпретирует как непосредственное обращение к этому адресу (или значению по этому адресу). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 16:18 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
А если не секрет, зачем Вам это? Просто из любопытства или какие-то конкретные практические цели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 16:20 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
Спасибо, Dihotom! Теперь более или менее ясно! Можно идти пить пиво по поводу пятницы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 16:22 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
DihotomА если не секрет, зачем Вам это? Просто из любопытства или какие-то конкретные практические цели? Изучаю с++, хочется понимать что я делаю не только на уровне Button1Click :) , но и чуть глубже. Предстоит писать довольно сложные клиентские части, если сейчас не задаваться этими вопросами, то со временем пропадет понимания чего я творю...имхо. Еще раз спасибо за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 16:26 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
Изучающий cpp wrote: > Где хранится адрес области памяти, ассоциированной с переменной? Нигде. Переменная - это и есть адрес. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 18:28 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
Изучающий cpp wrote: > >переменной i ставится в соответствие... > а где это осуществляется? В таблицах компилятора, хранящихся только во время компиляции. Затем в объектный файл записывается (иногда, не всегда) в виде тоже неких таблиц в объектном файле. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 18:31 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
Изучающий cpp DihotomА если не секрет, зачем Вам это? Просто из любопытства или какие-то конкретные практические цели? Изучаю с++, хочется понимать что я делаю не только на уровне Button1Click :) , но и чуть глубже. Предстоит писать довольно сложные клиентские части, если сейчас не задаваться этими вопросами, то со временем пропадет понимания чего я творю...имхо. Еще раз спасибо за помощь! Сложные клиентские части? С такой базой?????? Мама, роди меня обратно.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 18:46 |
|
||
|
адрес переменной
|
|||
|---|---|---|---|
|
#18+
Изучающий cpp wrote: > Где хранится адрес области памяти, ассоциированной с переменной? Да, кстати. С переменной может и не быть вообще ассоциированной памяти. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2008, 19:37 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35513343&tid=1345059]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 372ms |

| 0 / 0 |
