![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
ViGOur |
![]()
Сообщение
#1
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Сколько кода пересмотрел, код от кода разумеется различается, но заметил закономерность, используются в основном или ссылки или указатели, использование того и другого встречается редко.
1 вариант:
2 вариант:
3 вариант:
+ 1 и 2 вариант: экономия времени и памяти на копировании, в отличии от 3 варианта. - 3 вариант значение копируется во временную переменную и занимает дополнительную память p.s. затеял эту тему из-за интереса, сколько + и - наберем... ![]() |
|
|
![]() |
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
да, интересно, учитывая что она const.
|
|
|
Andrew Selivanov |
![]()
Сообщение
#3
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: ![]() ![]() ![]() |
Сколько кода пересмотрел, код от кода разумеется различается, но заметил закономерность, используются в основном или ссылки или указатели, использование того и другого встречается редко. 1 вариант:
2 вариант:
3 вариант:
+ 1 и 2 вариант: экономия времени и памяти на копировании, в отличии от 3 варианта. - 3 вариант значение копируется во временную переменную и занимает дополнительную память p.s. затеял эту тему из-за интереса, сколько + и - наберем... ![]() С точки зрения оптимизации в компиляторе (например -O2) для конкретного случая int-a и на разных компиляторах результаты будут разными. Я делаю как удобнее в конкретном случае. Можно ради интереса собрать эти три функции для MSVC 7,8 и GCC 3.x, 4.x (x386) и посмотреть, какой код сгенерится. А вообще оптимизация в ее глобальном понимании - зло ![]() |
|
|
Andrew Selivanov |
![]() ![]()
Сообщение
#4
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: ![]() ![]() ![]() |
Яркий пример работы оптимизатора GCC 3.4.5 (-O2):
И вот во что это в конечном счете соптимизировалось ![]()
|
|
|
ViGOur |
![]()
Сообщение
#5
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
- 1 и 2 варианты, в Qt, если невнимательно использовать сигналы и слоты, то при создании обьекта получателя сигнала в другом потоке, и при передаче в слот локальной переменной будут проблемы, в 3 варианте это не будет наблюдаться...
Пример:
Сообщение отредактировал ViGOur - 28.2.2008, 11:28 |
|
|
rich |
![]()
Сообщение
#6
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 123 Регистрация: 1.3.2008 Пользователь №: 109 Спасибо сказали: 6 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
0xF |
![]()
Сообщение
#7
|
Студент ![]() Группа: Участник Сообщений: 71 Регистрация: 12.11.2007 Пользователь №: 20 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата внутренне(в компиляторе) ссылки могут реализовать при помащи указателей А ссылка и указатель это одно и тоже по сути, просто синтаксис разный |
|
|
0xF |
![]()
Сообщение
#8
|
Студент ![]() Группа: Участник Сообщений: 71 Регистрация: 12.11.2007 Пользователь №: 20 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата void function( const int &rn) void function( const int *pn) ИМХО, так имеет смысл передавать только составные типы(если const), чтоб не копировать объект, а лишь перекинуть 4 байта адреса в ф-цию... Правка: Цитата void function( const int *pn) Это ещё для массивов может понадобиться ![]() Сообщение отредактировал 0xF - 17.3.2008, 21:09 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#9
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
если я правильнопонимаю Си, то ссылка и указатель разные вещи:
указатель - переменная содержащая адрес, может указыват в никуда; ссылка - псевдоним конкретной переменной, неможет указыват в никуда, т.е. всегда инициализируется конкретным значением; вроде так Сообщение отредактировал Litkevich Yuriy - 17.3.2008, 21:13 |
|
|
Admin |
![]()
Сообщение
#10
|
Администратор ![]() ![]() ![]() ![]() Группа: Администратор Сообщений: 646 Регистрация: 9.10.2007 Из: crossplatform.ru Пользователь №: 1 Спасибо сказали: 17 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#11
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
как я понимаю x'у
я имел ввиду следующий код:
неинициализированная ссылка |
|
|
Admin |
![]()
Сообщение
#12
|
Администратор ![]() ![]() ![]() ![]() Группа: Администратор Сообщений: 646 Регистрация: 9.10.2007 Из: crossplatform.ru Пользователь №: 1 Спасибо сказали: 17 раз(а) Репутация: ![]() ![]() ![]() |
Так не может быть, а так как я показал может быть, но вроде как инициализированная, а вроде как нет.
![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#13
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
в твоем примере она всегда инициализирована, нет момента когда она показывает в никуда
мало того n тоже равна 100, а точнее именно n, а не rn, это лишь псевдоним n |
|
|
0xF |
![]()
Сообщение
#14
|
Студент ![]() Группа: Участник Сообщений: 71 Регистрация: 12.11.2007 Пользователь №: 20 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Litkevich Yuriy) если я правильнопонимаю Си, то ссылка и указатель разные вещи: указатель - переменная содержащая адрес, может указыват в никуда; ссылка - псевдоним конкретной переменной, неможет указыват в никуда, т.е. всегда инициализируется конкретным значением; Во-первых, в С нету ссылок, они появились только в С++ Во-вторых, как это "псевдоним"? Внутри это такой же адрес... Выходит, что ссылка - такой же указатель, который не может указывать в никуда, а только на нужную область памяти(там где переменная хранится) + немного другой синтаксис(не надо разыменовывать, чтоб сделать выборку значения, как при работе с указателями) Ну и плюс ко всему, ссылка обязательно должна быть инициализирована, так что твой код(int n = 1; int &rn;) даже не соберется ![]() Цитата(Admin) int n = 1; int &rn = n; if( true) { int x = 100; rn=x; } // Чему равна rn? rn по-прежнему ссылается на n, а n тепер равна 100 ![]() Сообщение отредактировал 0xF - 17.3.2008, 23:31 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#15
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Цитата даже не соберется я его для того и привел, что ее инициализировать ее обязательно, а ссылка, может по праву считатся псевдонимом, если говорить я зыком литературным т.к. в указаном примере n будет равна 100, а rn ее псевдоним |
|
|
Novak |
![]()
Сообщение
#16
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 319 Регистрация: 15.3.2008 Из: Замкадыш Пользователь №: 121 Спасибо сказали: 28 раз(а) Репутация: ![]() ![]() ![]() |
Имхо, может по сути ссылки и указатели близки. Но вещи всеже разные, главное отличие в предназначении. Ссылки, как было сказано выше - псевдонимы переменных. Указатели же используются несколько шире, чем просто псевдонимы.
Не возьмусь судить о реализации в компиляторах, но вещи эти именно семантически, с точки зрения языка различны. |
|
|
Tonal |
![]()
Сообщение
#17
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
Во-вторых, как это "псевдоним"? Внутри это такой же адрес... Выходит, что ссылка - такой же указатель, который не может указывать в никуда, а только на нужную область памяти(там где переменная хранится) + немного другой синтаксис(не надо разыменовывать, чтоб сделать выборку значения, как при работе с указателями) Ссылка может быть, а может и не быть странслирована в указатель. Например, если ссылка находится в локальной зоне видимости, нормальный компилятор просто не будет заводить для неё отдельную ячейку памяти (см. например, приведённый тобой код). ![]() То же самое с подставляемыми (inline) функциями. Для временных объектов ссылка может вполне не быть указателем, а именно обозначать сам объект:
В этом случае, obj может трактоваться компилятором так же, как если бы было объявлено const derived_t obj. Смысла нет заводить здесь ещё и указатель. ![]() |
|
|
Tonal |
![]()
Сообщение
#18
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
Собственно, кардинальное различие в том, что указатель всегда имеет "свою" память и язык позволяет получить на неё указатель.
А ссылка не обязана иметь свою память, и средствами языка ты не можешь узнать имеет или нет. ![]() Какие-то манипуляции со ссылкой в языке всегда эквивалентны операциям над объектом которым она инициализирована. И в языке нет прямого способа манипулировать чем-то, что-бы было ссылкой. ![]() Сообщение отредактировал Tonal - 18.3.2008, 8:54 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 23.6.2025, 0:43 |