Форум программистов, компьютерный форум CyberForum.ru

Что делает компилятор с этим? - C++

Восстановить пароль Регистрация
 
ктумфен
1 / 1 / 0
Регистрация: 29.09.2013
Сообщений: 18
15.06.2014, 20:07     Что делает компилятор с этим? #1
Здравствуйте, такой вопрос: что делает компилятор с операторами типа:
C++
1
2
3
4
int x;
15.5f;
3, 'c';
"stroka", x;
он их просто игнорирует или как?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
15.06.2014, 20:16     Что делает компилятор с этим? #2
ну если там оптимизатор стоит то мб и игнорирует
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
15.06.2014, 20:23     Что делает компилятор с этим? #3
А это для компилятора разве не простой набор символов?
Тут ведь ничего не определено кроме х.
Компилятор знает что х будет ровным числом без остатка.
Qazan
211 / 59 / 9
Регистрация: 30.04.2013
Сообщений: 780
Записей в блоге: 10
15.06.2014, 20:28     Что делает компилятор с этим? #4
ктумфен, иногда выдаються сообщения типа
"Неиспользуемая локальная переменная"

как думаете зря ?
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
15.06.2014, 20:30     Что делает компилятор с этим? #5
Цитата Сообщение от mster-doc Посмотреть сообщение
Тут ведь ничего не определено кроме х.
Компилятор знает что х будет ровным числом без остатка.
но память под контанты всёравно выделяется при компиляции
IIARTEMII
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
Завершенные тесты: 1
15.06.2014, 20:34     Что делает компилятор с этим? #6
ктумфен, с отключенными оптимизациями (по своему наивному, но оправданному опыту), могу совершенно точно сказать, что в 3 и 4 строках будут созданы временные переменные, в которые будут записаны результаты операции "запятая", а именно - возврат правого операнда. Как и про первую строчку - выделение памяти под int (чаще всего 4 байт). Про вторую ничего не могу сказать... это вам надо было в "эксперты" писать)
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
15.06.2014, 20:49     Что делает компилятор с этим? #7
minGW32 с оптимизатором не пропускает, а вот если на камне делать на той же avr-ке без оптимизатора то будет тоже что и const float a=15.5; ну только без возможности доступа через а
IIARTEMII
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
Завершенные тесты: 1
15.06.2014, 21:09     Что делает компилятор с этим? #8
dzrkot, интересно, а почему собственно const? мы можем внезапно найти адрес в памяти, где хранится этот объект и изменить его программным методом. Он точно будет размещён в read-only секции?
Я где-то видел, что такие конструкции транслируются путем подстановки вместо конкретных значений конкретных временных объектов в памяти, расположенных в секции read-write для оптимизаций использования памяти во всей программе - тут не так?
ктумфен
1 / 1 / 0
Регистрация: 29.09.2013
Сообщений: 18
15.06.2014, 21:31  [ТС]     Что делает компилятор с этим? #9
Цитата Сообщение от IIARTEMII Посмотреть сообщение
будут созданы временные переменные, в которые будут записаны результаты операции "запятая", а именно - возврат правого операнда
это будет записанно в стек?

Добавлено через 14 минут
Qazan, нет не думаю что зря, прост интересно. Выделится ли для них память и т.п.
А может кто-нибудь из экспертов задаст этот вопрос в соответствующем разделе)))
Все же всем спасибо
IIARTEMII
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
Завершенные тесты: 1
15.06.2014, 21:41     Что делает компилятор с этим? #10
ктумфен, у временных объектов есть такая особенность, как возможность продлить время их жизни путём создания константной ссылки на один из экземпляров.
Честно, лично я не знаю как конкретно делает C++ в данной ситуации, но значения функций он точно убирает в стек, однако временные объекты вычислений он может создавать и динамически (выделяя память в куче), о чём и намекает возможность продления их жизни. Создание такого объекта в стеке усложняет обработку стека при вычислениях (там же находятся точки возврата из процедур и всевозможные другие служебные данные), однако в противоречие своим же словам могу сказать, что ссылку можно завести в той же области видимости, где и создаётся временный объект, что не накладывает никаких ограничений и дополнительных сложностей для управления стеком.
Получается, что существует два возможных варианта сохранения таких объектов (даже три) - константные оптимизации компилятора (создание перманентной области памяти под все временные объекты); динамическое выделение памяти под них; размещение в стеке.
Спасибо за интересный вопрос) На досуге надо будет в руках с дизассемблером и профилировщиком разобраться в этом вопросе

Добавлено через 1 минуту
Под "значения функций" я имел в виду возвращаемые значения (при отсутствии присваивания чему-либо этого самого значения)...
ктумфен
1 / 1 / 0
Регистрация: 29.09.2013
Сообщений: 18
15.06.2014, 21:45  [ТС]     Что делает компилятор с этим? #11
IIARTEMII, спасиб, разберешься сообщишь)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2014, 23:33     Что делает компилятор с этим?
Еще ссылки по теме:

Что это за знак >> прочитал что это сдвиг вправо? что он делает C++
Что не так с этим кодом? C++
C++ Что делает операция new?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
IIARTEMII
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
Завершенные тесты: 1
15.06.2014, 23:33     Что делает компилятор с этим? #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот это поворот) С функциями я уже сказал, что всё хранится в стеке - так оно и есть, об этом говорит Страуструп, MSDN и несколько других источников, что подтверждается путем отладки и проверки адресов (в дизассемблированном виде не смотрел). А вот с временными объектами вычислений всё намного круче)
Я очень много протестировал различных примеров, приведу самый простой и понятный:
C++
1
_tt = _t * _tt - _tt;
где __t и _t - объекты типа int, в которые динамически заносятся значения (в момент выполнения считываются с потока ввода).
И что же мы видим?
Assembler
1
2
3
4
mov     edx, [ebp+var_4]
imul    edx, [ebp+var_8]
sub     edx, [ebp+var_8]
mov     [ebp+var_8], edx
Откуда видно, что временный объект хранится в регистре; не в памяти, не в стеке, а в регистре!
Тот же пример, но с типом double:
Assembler
1
2
3
4
fld     [ebp+var_8]
fmul    [ebp+var_10]
fsub    [ebp+var_10]
fstp    [ebp+var_10]
Кратко поясню: при работе с вещественными числами используется FPU. Для правильной работы FPU предоставляется некоторый стек (который в языке ассемблера также предоставляется в виде специальных регистров R0-R7, а сам стек рассматривается как ST-ST(7); доступ к ним напрямую закрыт, но возможен через mm0-mm7 (расширение MMX) бла бла...). Так вот этот самый стек и используется при работе с double.
Подводя итог, можно выделить следующее:
  • возвращаемые значения функций передаются через стек (в асме не проверено)
  • целые числа, целиком влезающие в регистры, помещаются в регистры
  • вещественный тип работает через стек FPU
Ещё разок: всё вышеизложенное относится к временным объектам, которые программистом напрямую не контролируются. Также, возможно, целые числа sizeof() > 4 байт на 32-битных процессорах помещаются в стек (я не проверил) или работают через пары регистров, например edx, eax.

Добавлено через 8 минут
И ещё кое-что: не рассматриваю в данном случае передачу возвращаемого значения функции через eax, иначе как же можно завести нечто следующее:
C++
1
const int& ref = foo();
Где foo:
C++
1
2
3
const int& foo();
// или
int foo();
Не знаю как это назвать тогда - ссылка на регистр? Конечно, понятно, что в таких случаях код транслируется по-разному, но просто я это не учитывал)
Yandex
Объявления
15.06.2014, 23:33     Что делает компилятор с этим?
Ответ Создать тему
Опции темы

Текущее время: 02:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru