![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
wowka19 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Вариант 1:
Вариант 2:
Это ведь одно и тоже? как сточки зрения дальнейшей работы с переменными d и i, так с точки зрения конечного машинного кода? Спасибо. |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Не думаю. Во втором варианте создается временная переменная-копия переменной d типа int и i получает на нее ссылку. В 1м случае просто создается константа. Т.е. на одну сущность меньше. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
wowka19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Понятно, что логически это разные вещи, но "сточки зрения дальнейшей работы с переменными d и i, и с точки зрения конечного машинного кода" равнозначно?
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Теоритически код должен получится другой. Практически оптимизатор в компиляторе (если он достаточно умный) может быть сможет сделать код одинаковым.
По семантике скорее всего разницы не будет. |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 5 Всего: 32 |
![]() ![]() Хотя, после оптимизации, скорее всего будет равнозначно, но это будет зависить от контекста. -------------------- ![]() |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Насколько я помню в С++ есть такое правило, что временный объект на который есть константная ссылка продлевает свое время жизни на время пока жива ссылка. Так что результат может зависеть от того какой код будет ниже. В первом случае нет константной ссылки.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
TarasProger |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 5.8.2015 Репутация: нет Всего: нет |
Добавлено @ 06:48 По семантике разница уже есть: в одном случае просто именнованная константа получает зультат приведения другой переменной к инту в качестве значения, а в другом создаётся безымянная констнатна с таким значением и деклариуется её именованный синоним. Вот смотри: есть психически здововый человек, а есть недошизофреник, заявляющий: "Я не - я, кто то другой, считающий, что он - это я.", семантика их диагнозов различна. Это сообщение отредактировал(а) TarasProger - 12.8.2015, 06:49 |
|||
|
||||
TarasProger |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 5.8.2015 Репутация: нет Всего: нет |
Что самое интересное,
Добавлено через 2 минуты и 59 секунд А вот так:
Это сообщение отредактировал(а) TarasProger - 12.8.2015, 09:05 |
||||||
|
|||||||
wowka19 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
TarasProger, но в коде при всем желании вы уже не отличите одно от другого. Каким бы не был дальнейший код, принимающий i - результат один и тот же.
Цель моего вопроса-сравнения лучше понять тонкости языка. Интерес вызывает не философия и как это правильно называть (в этом я разобрался), а различия как на уровне дальнейшего использования i, так и внутренняя реализация. Поэтому еще раз: как я в итоге понял что оба варианта с точки зрения дальнейшего использования i - идентичны (если нет, то приведите пример, опровергающий мой вывод), а с точки зрения внутреннего расположения в памяти оба варианта тоже равнозначны - и там и там i - единственное имя участка памяти под int. Вот еще вопрос: Вариант 1:
Вариант 2:
В обоих случаях v - имя участка статической памяти под int? Существует ли код, который ведет себя по-разному в зависимости от варианта определения v? p.s: TarasProger, ничего странного, ибо const гарантирует только невозможность изменить объект только через идентификатор, к которому этот спецификатор (const) добавлен. Это сообщение отредактировал(а) wowka19 - 12.8.2015, 09:18 |
||||
|
|||||
TarasProger |
|
||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 5.8.2015 Репутация: нет Всего: нет |
Добавлено через 6 минут и 15 секунд Это тоже не гарантировано,
Это сообщение отредактировал(а) TarasProger - 12.8.2015, 09:34 |
||||||||||||
|
|||||||||||||
wowka19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
TarasProger, ага, т.е. в случае с int i, временная переменная, созданная для приведения типа, используется для инициализации int i, и тут же удаляется. А как это на стеке выглядит?
|
|||
|
||||
TarasProger |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 5.8.2015 Репутация: нет Всего: нет |
Странного то ничего, просто нюанс, понять который можно только подумав конкретно над подобным вот кодом. В случае приведения то i - действительно константа, хоть просто так её декларируй, хоть как ссылку, а без привидения остаётся разрещена модификация через другой идентификатор. И всё правильно, так как в одном случае сущностей две, а в другом одна, но с двумя идентификаторами, имеющими разные свойства. А раз сущность одна, то меняя её через идентификатор переменной, меняем её не зависимо от того, через какой идентификатор будем читать. Добавлено через 3 минуты и 23 секунды
Это сообщение отредактировал(а) TarasProger - 12.8.2015, 09:49 |
|||
|
||||
TarasProger |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 5.8.2015 Репутация: нет Всего: нет |
Кстати, есть языки, где именованная константа - это просто имя литерала, инлайнящегося по месту использования. То есть
Это сообщение отредактировал(а) TarasProger - 12.8.2015, 10:22 |
||||
|
|||||
wowka19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
TarasProger, спасибо, но кажется вы не поняли мой второй вопрос. У меня нет "const int v=42". Продублирую:
Это сообщение отредактировал(а) wowka19 - 13.8.2015, 03:53 |
|||
|
||||
TarasProger |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 5.8.2015 Репутация: нет Всего: нет |
А вот как раз
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |