| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Объясните разницу |
| Автор: wowka19 11.8.2015, 06:25 | ||||
Вариант 1:
Вариант 2:
Это ведь одно и тоже? как сточки зрения дальнейшей работы с переменными d и i, так с точки зрения конечного машинного кода? Спасибо. |
| Автор: Alexeis 11.8.2015, 08:22 |
Не думаю. Во втором варианте создается временная переменная-копия переменной d типа int и i получает на нее ссылку. В 1м случае просто создается константа. Т.е. на одну сущность меньше. |
| Автор: wowka19 11.8.2015, 08:39 |
| Понятно, что логически это разные вещи, но "сточки зрения дальнейшей работы с переменными d и i, и с точки зрения конечного машинного кода" равнозначно? |
| Автор: xvr 11.8.2015, 11:25 |
| Теоритически код должен получится другой. Практически оптимизатор в компиляторе (если он достаточно умный) может быть сможет сделать код одинаковым. По семантике скорее всего разницы не будет. |
| Автор: Cheloveck 11.8.2015, 11:26 |
![]() Хотя, после оптимизации, скорее всего будет равнозначно, но это будет зависить от контекста. |
| Автор: Alexeis 11.8.2015, 20:32 |
| Насколько я помню в С++ есть такое правило, что временный объект на который есть константная ссылка продлевает свое время жизни на время пока жива ссылка. Так что результат может зависеть от того какой код будет ниже. В первом случае нет константной ссылки. |
| Автор: TarasProger 12.8.2015, 09:03 | ||||||
Что самое интересное,
Добавлено через 2 минуты и 59 секунд А вот так:
|
| Автор: wowka19 12.8.2015, 09:11 | ||||
| TarasProger, но в коде при всем желании вы уже не отличите одно от другого. Каким бы не был дальнейший код, принимающий i - результат один и тот же. Цель моего вопроса-сравнения лучше понять тонкости языка. Интерес вызывает не философия и как это правильно называть (в этом я разобрался), а различия как на уровне дальнейшего использования i, так и внутренняя реализация. Поэтому еще раз: как я в итоге понял что оба варианта с точки зрения дальнейшего использования i - идентичны (если нет, то приведите пример, опровергающий мой вывод), а с точки зрения внутреннего расположения в памяти оба варианта тоже равнозначны - и там и там i - единственное имя участка памяти под int. Вот еще вопрос: Вариант 1:
Вариант 2:
В обоих случаях v - имя участка статической памяти под int? Существует ли код, который ведет себя по-разному в зависимости от варианта определения v? p.s: TarasProger, ничего странного, ибо const гарантирует только невозможность изменить объект только через идентификатор, к которому этот спецификатор (const) добавлен. |
| Автор: TarasProger 12.8.2015, 09:33 | ||||||||||||
Добавлено через 6 минут и 15 секунд Это тоже не гарантировано,
|
| Автор: wowka19 12.8.2015, 09:41 |
| TarasProger, ага, т.е. в случае с int i, временная переменная, созданная для приведения типа, используется для инициализации int i, и тут же удаляется. А как это на стеке выглядит? |
| Автор: TarasProger 12.8.2015, 09:47 | ||||
Добавлено через 3 минуты и 23 секунды
|
| Автор: TarasProger 12.8.2015, 10:18 | ||||
Кстати, есть языки, где именованная константа - это просто имя литерала, инлайнящегося по месту использования. То есть
|
| Автор: wowka19 13.8.2015, 03:52 |
| TarasProger, спасибо, но кажется вы не поняли мой второй вопрос. У меня нет "const int v=42". Продублирую: |
| Автор: TarasProger 13.8.2015, 09:47 | ||||
А вот как раз
|
| Автор: feodorv 13.8.2015, 11:17 | ||
Для глобальной переменной - да. Здесь const подразумевает static. Если, например, в заголовочном файле определить константную строку:
то эта строка будет дублироваться в каждом компилируемом файле, который сделал #include "MyHeader". Что может повлечь за собой дополнительные расходы на размер исполняемого файла. |
| Автор: TarasProger 13.8.2015, 11:40 | ||
|
| Автор: wowka19 17.8.2015, 08:37 | ||||||
feodorv, извините, я наверное уже достал, но у меня static явно указан: Вариант 1:
Вариант 2:
Что бы расставить все точки: - в первом варианте в какой памяти находится значение? статической или автоматической(стек)? - во втором варианте в какой памяти находится значение? статической или автоматической(стек)? Спасибо! |
| Автор: TarasProger 17.8.2015, 10:50 | ||||
|
| Автор: feodorv 17.8.2015, 12:58 |
Для константной глобальной (file scope, т.е. определённой вне функции или класса без указания extern) переменной действителен квалификатор static (указан он или нет). |
| Автор: volatile 17.8.2015, 14:38 |
После оптимизации, как в первом, так и во втором случае, константа вообще ни в какой памяти не будет находится. т.е. под константу не определяется какой-то физический адрес, а значение просто подставляется в код в необходимых местах. т.е. полный аналог сишного #define v 42 Но это только в том случае, если где либо в программе не встретиться указатель (который нельзя соптимизировать) на эту константу. В этом случае компилятор будет вынужден разместить ее в статической памяти, и дать ее адрес. В общем зависит от дальнейшего кода. |