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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объясните разницу 
:(
    Опции темы
wowka19
Дата 11.8.2015, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вариант 1:
Код

double d = 3.14;
const int i = d;


Вариант 2:
Код

double d = 3.14;
const int &i = d;


Это ведь одно и тоже? как сточки зрения дальнейшей работы с переменными d и i, так с точки зрения конечного машинного кода?
Спасибо.
PM MAIL   Вверх
Alexeis
Дата 11.8.2015, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(wowka19 @  11.8.2015,  07:25 Найти цитируемый пост)
так с точки зрения конечного машинного кода?
Спасибо. 

  Не думаю. Во втором варианте создается временная переменная-копия переменной d типа int и i получает на нее ссылку. В 1м случае просто создается константа. Т.е. на одну сущность меньше.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
wowka19
Дата 11.8.2015, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Понятно, что логически это разные вещи, но "сточки зрения дальнейшей работы с переменными d и i, и с точки зрения конечного машинного кода" равнозначно?
PM MAIL   Вверх
xvr
Дата 11.8.2015, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Теоритически код должен получится другой. Практически оптимизатор в компиляторе (если он достаточно умный) может быть сможет сделать код одинаковым.

По семантике скорее всего разницы не будет.

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


Эксперт
***


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

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



Цитата(wowka19 @  11.8.2015,  09:39 Найти цитируемый пост)
 с точки зрения конечного машинного кода" равнозначно? 

 smile 
user posted image
Хотя, после оптимизации, скорее всего будет равнозначно, но это будет зависить от контекста.


--------------------
user posted image
PM Jabber   Вверх
Alexeis
Дата 11.8.2015, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



  Насколько я помню в С++ есть такое правило, что временный объект на который есть константная ссылка продлевает свое время жизни на время пока жива ссылка. Так что результат может зависеть от того какой код будет ниже. В первом случае нет константной ссылки.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
TarasProger
Дата 12.8.2015, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(wowka19 @  11.8.2015,  08:39 Найти цитируемый пост)
Понятно, что логически это разные вещи, но "сточки зрения дальнейшей работы с переменными d и i, и с точки зрения конечного машинного кода" равнозначно? 
Вам только что объяснили разницу с точки зрения кода.

Добавлено @ 06:48
Цитата(xvr @  11.8.2015,  11:25 Найти цитируемый пост)
По семантике скорее всего разницы не будет.
По семантике разница уже есть: в одном случае просто именнованная константа получает зультат приведения другой переменной к инту в качестве значения, а в другом создаётся безымянная констнатна с таким значением и деклариуется её именованный синоним. Вот смотри: есть психически здововый человек, а есть недошизофреник, заявляющий: "Я не - я, кто то другой, считающий, что он - это я.", семантика их диагнозов различна.


Это сообщение отредактировал(а) TarasProger - 12.8.2015, 06:49
PM MAIL   Вверх
TarasProger
Дата 12.8.2015, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Что самое интересное, 
Код
 double d = 3.14;
 const double &i = d;// нифига не константа, а просто синоним d: при изменении d, i тоже меняется.
 Но 
Код
 double d = 3.14;
 const double &i = d;
 i=26.44; // Это строка не валидна
.

Добавлено через 2 минуты и 59 секунд
А вот так: 
Код
 double d = 3.14;
 const double i = d;
 i на изменения d не реагирует, это действительно константа.

Это сообщение отредактировал(а) TarasProger - 12.8.2015, 09:05
PM MAIL   Вверх
wowka19
Дата 12.8.2015, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



TarasProger, но в коде при всем желании вы уже не отличите одно от другого. Каким бы не был дальнейший код, принимающий i - результат один и тот же.
Цель моего вопроса-сравнения лучше понять тонкости языка. Интерес вызывает не философия и как это правильно называть (в этом я разобрался), а различия как на уровне дальнейшего использования i, так и внутренняя реализация. Поэтому еще раз: как я в итоге понял что оба варианта с точки зрения дальнейшего использования i - идентичны (если нет, то приведите пример, опровергающий мой вывод), а с точки зрения внутреннего расположения в памяти оба варианта тоже равнозначны - и там и там i - единственное имя участка памяти под int.

Вот еще вопрос:
Вариант 1:
Код

const static int v = 42;

Вариант 2:
Код

const int &v = 42;

В обоих случаях v - имя участка статической памяти под int?
Существует ли код, который ведет себя по-разному в зависимости от варианта определения v?

p.s: TarasProger, ничего странного, ибо const гарантирует только невозможность изменить объект только через идентификатор, к которому этот спецификатор (const) добавлен.

Это сообщение отредактировал(а) wowka19 - 12.8.2015, 09:18
PM MAIL   Вверх
TarasProger
Дата 12.8.2015, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(wowka19 @  12.8.2015,  09:11 Найти цитируемый пост)
TarasProger, но в коде при всем желании вы уже не отличите одно от другого. Каким бы не был дальнейший код, принимающий i - результат один и тот же.
Обращающийся код - не весь код, а создание и уничтожение временной переменной - это всё таки операции, которые тоже должны быть закодированы. Пусть в случае 
Код
double d=3.14;
const int &i=d;
 "временная переменная" в силу свой синонимичности d превращается в обычную локальной/глобальной константы. Но в случае 
Код

double d=3.14;
const int i=d;
 имеют место быть две целые величины, а не одна, одна из них действительно временная и после инициализации второй величины уничтожается, вторая же - вполне обычная локальная/глобальная константа. И вот в этом то не уничтожении лишней интовой переменной и заключается различие, если только одно не будет оптимизировано до другого. Дальнейший код одинаков, но и сама декларация создаёт код, по идее различный, хотя такое различие и не гарантировано.

Добавлено через 6 минут и 15 секунд
Цитата(wowka19 @  12.8.2015,  09:11 Найти цитируемый пост)
В обоих случаях v - имя участка статической памяти под int?
Это тоже не гарантировано, 
Код
void f()
{
 const int v=42;// может быть закодировано в операцию, присваивающую 42 участку стека и запрещать модификацию этого участка
, но в силу константности данной величины, её значение едино для всех экземпляров функции, что и определяет целессобразность оптимизации компилятором 
Код
void f()
{
 const int v=42;
 до 
Код
void f()
{
 const static int v=42;
.

Это сообщение отредактировал(а) TarasProger - 12.8.2015, 09:34
PM MAIL   Вверх
wowka19
Дата 12.8.2015, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



TarasProger, ага, т.е. в случае с int i, временная переменная, созданная для приведения типа, используется для инициализации int i, и тут же удаляется. А как это на стеке выглядит?
PM MAIL   Вверх
TarasProger
Дата 12.8.2015, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(wowka19 @  12.8.2015,  09:11 Найти цитируемый пост)
p.s: TarasProger, ничего странного, ибо const гарантирует только невозможность изменить объект только через идентификатор, к которому этот спецификатор (const) добавлен.
Странного то ничего, просто нюанс, понять который можно только подумав конкретно над подобным вот кодом. В случае приведения то i - действительно константа, хоть просто так её декларируй, хоть как ссылку, а без привидения остаётся разрещена модификация через другой идентификатор. И всё правильно, так как в одном случае сущностей две, а в другом одна, но с двумя идентификаторами, имеющими разные свойства. А раз сущность одна, то меняя её через идентификатор переменной, меняем её не зависимо от того, через какой идентификатор будем читать.

Добавлено через 3 минуты и 23 секунды
Код
 const double d = 3.14;
 double &i = d;//Эта строка вообще не валидна.


Это сообщение отредактировал(а) TarasProger - 12.8.2015, 09:49
PM MAIL   Вверх
TarasProger
Дата 12.8.2015, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Кстати, есть языки, где именованная константа - это просто имя литерала, инлайнящегося по месту использования. То есть 
Код
const a:integer=24;
var b:integer;
    c:integer;
begin
     b:=a;
     c:=a;
 означает просто 
Код
var b:integer;
    c:integer;
begin
     b:=24;
     c:=24;
, значение подставляется на этапе компиялции и адреса не имеет, соответственно указатель на него взять нельзя. А на c++ можно. Константы там - это почти макрсоы, толко строго и статически типизированные и напихать в них операций нельзя. При этом некоторые, например, паскаль, допускают и явную, и неявную типизацию именованных констант.

Это сообщение отредактировал(а) TarasProger - 12.8.2015, 10:22
PM MAIL   Вверх
wowka19
Дата 13.8.2015, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



TarasProger, спасибо, но кажется вы не поняли мой второй вопрос. У меня нет "const int v=42". Продублирую:
Цитата(wowka19 @  12.8.2015,  09:11 Найти цитируемый пост)
Вот еще вопрос:
Вариант 1:
Код

const static int v = 42;

Вариант 2:
Код

const int &v = 42;


В обоих случаях v - имя участка статической памяти под int?
Существует ли код, который ведет себя по-разному в зависимости от варианта определения v?


Это сообщение отредактировал(а) wowka19 - 13.8.2015, 03:53
PM MAIL   Вверх
TarasProger
Дата 13.8.2015, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А вот как раз 
Код
const int &v = 42;
 и 
Код
const int v = 42;
 - одно и тоже: здесь нет временной величины, так как значение не нужно вычислять, есть обычная глобальная/локлаьная константа и литерал, const в сочетании с меткой декларирует, что 42 должно стать значением временной величины и тут же продляет её существование до обычной локальной/глобальной, так как v нифига не временна, но является синонимом. А staitic гарантировано кладёт её в память рядом с глобальными данными.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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