Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> физич. смысл указателей и ссылкок, в чем заключается физический смысл ссылк 
:(
    Опции темы
UnrealMan
Дата 19.12.2008, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(GoldFinch @  19.12.2008,  09:05 Найти цитируемый пост)
UnrealMan, а что тогда не абстракция ЯП?

Ну, это смотря какого уровня абстракции рассматривать smile Здесь под ЯП, видимо, имелся в виду язык программирования высокого уровня. В C++ переменная - это именованный объект, а объект - это регион памяти на абстрактной машине. Стандарт не обязывает реализацию хранить объект в реальной памяти - реализация обязана только обеспечивать наблюдаемое поведение, эквивалентное поведению абстрактной машины, а как она это будет делать - проблемы реализации.

Например, для такого исходного кода

Код
int f()
{
    void g(int);
    int n = 2;
    int *p = &n;
    int &r = *p;
    g(r);
}

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

Код
int f()
{
    void g(int);
    g(2);
}

PM MAIL   Вверх
Romikgy
Дата 19.12.2008, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
GoldFinch
Дата 19.12.2008, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



вобщем  если мыслить абстрактно - то 
есть переменные, обычно в памяти, 
адреса этих переменных - это ссылки. 
переменные хранящие адреса (ссылки) - указатели
PM MAIL ICQ   Вверх
mes
Дата 19.12.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(UnrealMan @  19.12.2008,  12:53 Найти цитируемый пост)
Ссылка - это не переменная.

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

Цитата(UnrealMan @  19.12.2008,  12:53 Найти цитируемый пост)
В отличие от неконстантного указателя. 

Константный указатель и ссылка неизменяются по разным "идеологическим" причинам. 





--------------------
PM MAIL WWW   Вверх
UnrealMan
Дата 19.12.2008, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(mes @  19.12.2008,  17:48 Найти цитируемый пост)
под словом "переменная" подразумевалось собирательное название именований, используемых в коде для ассоциации с каким либо "объектом"

Ну, правильно, переменная - это обозначение объекта, вводимое через его объявление. Поскольку ссылка - это не объект, переменная не  может обозначать ссылку.
PM MAIL   Вверх
mes
Дата 19.12.2008, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Код

А a;
A& ra;
 
чего то не то.. UnrealMan, ведь должно же быть собирательное слово для a и  ra ?!


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 20.12.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Такая вот абстракция получилась

Код

typedef int A;

A & func(A &rb)
{
    return rb;
}

int main(int argc, char *argv[])
{
    asm("nop;nop;nop");
    A a;
    A &ra = a;
    func(ra);
    return 0;
    asm("nop;nop;nop");
}


Поправьте меня если я буду не прав в комментариях...

Код

0x00401322 <main+42>:   nop
0x00401323 <main+43>:   nop
0x00401324 <main+44>:   nop
0x00401325 <main+45>:   lea    -0x4(%ebp),%eax ; берем ссылку (адрес) из созданной на стеке ;переменной типа int
0x00401328 <main+48>:   mov    %eax,-0x8(%ebp) ; ссылку помещаем в другую область 
;памяти (по сути во вторую переменную, которая реально может уже быть указателем)
0x0040132b <main+51>:   mov    -0x8(%ebp),%eax ; переливая из пустого в 
;порожнее разыменовываем указатель и получаем ссылочку
0x0040132e <main+54>:   mov    %eax,(%esp) ; пихаем адрес переменной, которая находится 
;ниже на стеке - выше, на вершину стека (типа передали в функцию ссылку)
0x00401331 <main+57>:   call   0x4012f0 <_Z4funcRi>
0x00401336 <main+62>:   mov    $0x0,%eax; возвратили зеро
0x0040133b <main+67>:   leave
0x0040133c <main+68>:   ret
0x0040133d <main+69>:   nop
0x0040133e <main+70>:   nop
0x0040133f <main+71>:   nop


Не спрашивайте зачем я это выложил, я сам не знаю, просто интересно было посмотреть, что же там внутри  smile 

Это сообщение отредактировал(а) SABROG - 20.12.2008, 14:38


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Romikgy
Дата 21.12.2008, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



Цитата(SABROG @  20.12.2008,  13:16 Найти цитируемый пост)
lea    -0x4(%ebp),%eax ; берем ссылку (адрес) из созданной на стеке ;переменной типа int

данная комбинация имхо обозначает что взять указатель ( т.е. адресс)  smile 
и в функцию уходит указатель (адресс) переменой...


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
SABROG
Дата 21.12.2008, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Цитата(Romikgy @ 21.12.2008,  18:23)
Цитата(SABROG @  20.12.2008,  13:16 Найти цитируемый пост)
lea    -0x4(%ebp),%eax ; берем ссылку (адрес) из созданной на стеке ;переменной типа int

данная комбинация имхо обозначает что взять указатель ( т.е. адресс)  smile 
и в функцию уходит указатель (адресс) переменой...

Имхо по ebp-4 должно находится содержимое переменной, в моем случае это содержимое имеет тип int. В то время как lea берет адрес на это содержимое, т.е. ссылку (не указатель). Далее адрес (ссылка) пихается в переменную ra (вы меня извините, что я так свободно оперирую понятием переменной, но на уровне ассемблера любой адрес доступный для записи - переменная), которая лежит по адресу ebp-8. Теперь сам адрес ebp-8 по праву можно считать указателем, т.к. по этому адресу лежит ссылка (адрес a). Но из-за того, что в функцию передается именно ссылка, а не указатель, то значение ссылки извлекается обратно в регистр. Тут видно, что по-хорошему компилятор должен оптимизировать все это до такой степени, чтобы никаких новых переменных не заводилось вообще. При оптимизации -O1  и выше он вообще удаляет все что связано с этими переменными и саму фукнцию func, т.к. они не используются. Остается один лишь return.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
MAKCim
Дата 21.12.2008, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



SABROG, 
у тебя как-то все сложновато  smile 
на самом деле все намного проще
на уровне ассемблера и ниже есть только адреса (точнее смещение относительно сегментов) и значения по этим адресам


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Romikgy
Дата 21.12.2008, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



по моему надо конкретно определится что есть указатель, а что есть ссылка!

на мой взгляд указатель это переменная которая содержит адресс переменой на которую указывает !
так что асмовая команда lea как раз соответствует этой задаче.
Код

LEA Load Efective Address. 

http://www.xs4all.nl/~smit/asm01001.htm

ваше высказывание?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
SABROG
Дата 22.12.2008, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Есть две команды

Код

mov eax, OFFSET message


Код

lea eax,message


Обе выполняют одну и ту же работу - берут адрес и пихают в регистр. Но когда дело доходит до адресной арифметики, то обычным mov уже не отделаться:

Код

lea eax,[ebx+4 * ecx]


В скобках происходит математическая операция с адресом, результат которой помещается в eax (не содержимое по этому адресу, а всего-лишь сам адрес). В моем случае эта операция Адрес_ebp-4_байта=адрес(ссылка)_на_переменную_содержащую_значение_int(4_байта).

MAKCim, у меня то как раз все просто, я с ассемблера в C++ пришел. Правда сейчас подзабыл многое. Если говорить о смещениях и сегментах, то да, в данном случае смещения я называю адресом, несмотря на то, что это не реальный адрес как в реальном режиме процессора и FLAT памятью. Т.ч. можно называть смещения - ссылками, а смещения, которые содержат смещения - указатели  smile 

Это сообщение отредактировал(а) SABROG - 22.12.2008, 00:21


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 22.12.2008, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(SABROG @ 22.12.2008,  00:21)
Код

lea eax,[ebx+4 * ecx]


В скобках происходит математическая операция с адресом, результат которой помещается в eax (не содержимое по этому адресу, а всего-лишь сам адрес). В моем случае эта операция Адрес_ebp-4_байта=адрес(ссылка)_на_переменную_содержащую_значение_int(4_байта).

Операция выполняемая данной командой эквивалентна: eax = ebx + 4*ecx? Если да, то давать отдельную мнемонику не было никакого смысла - можно было бы тогда и mov обойтись без квадратных скобок, более того, это было бы понятней, чем использование LEA. Имхо.
PM   Вверх
SABROG
Дата 22.12.2008, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Как говорится пути компилятора неисповедимы, тем более, что код скомпилен без оптимизации. Да и скорее всего mov использовался бы в случае, если переменные были статическими и глобальными.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
GoldFinch
Дата 22.12.2008, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Цитата(SABROG @  22.12.2008,  00:21 Найти цитируемый пост)
Есть две команды
mov eax, OFFSET message
lea eax,message

команды lea eax,message нет и быть не может
есть lea eax,[message]
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0751 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.