|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
15.04.2013, 00:26 | #1 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Падает релиз, или корявые оптимизации
Рассмотрим два примера:
Код:
Код:
Компилятор гцц все нормально прожевал. Вижуал студия затупила. При попытке прочитать данные по адресу релиз-версия падает с исключением. Если сделать в туловище конструктора отладочный вывод члена, который запоминает получаемый адрес, то все сразу же начинает работать без ошибок. Видимо, компилятор видит использование адреса, и не трогает его... Что бы заптетить компилятору оптимизировать аргументы, я сделал их volatile После этого, компилятор от вижал студии сразу же заработал, и в дебаге и в релизе. А вот гцц наотрез отказался принимать на входе временные объекты. То есть, уже нельзя было сделать: Код:
В итоге, в настоящий момент ситуация разруливается при помощи препроцессора: для студии аргументы помечены volatile. Я опасаюсь, что на определенном уровне оптимизации, гцц тоже может оптимизировать аргумент, и его релизная сборка провалится. Вопрос следующий: как можно запретить компилятору оптимизировать аргументы, так, что бы при этом и студия и гцц могли единообразно работать с временными объектами? Желательно без препроцессора. Решение должно поддерживать 2003 стандарт, гцц/мингв, компиляторы от вижал студии линейки 2008-2012 |
15.04.2013, 09:03 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,493
|
Кода нет, так что непонятно в чем проблема.
Кстати, учитывайте, что Arg arg=... в gcc вызывает не конструктор а оператор копирования. Попробуйте Arg arg(...) |
15.04.2013, 09:26 | #3 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Код:
Создает объект всегда конструктор. Код:
Последний раз редактировалось _Bers; 15.04.2013 в 09:48. |
|
15.04.2013, 11:08 | #4 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Стоп.
В конструкторе Вы берёте адрес переданного (временного) объекта? А Вы уверены, что по стандарту такой код должен работать, логически? Если это нужно-таки делать именно так, я бы предложил макрос, что-то вроде: Код:
|
15.04.2013, 11:40 | #5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,493
|
По стандарту
Arg arg = 10 Еквивалентно Arg arg; arg = 10; MSVC это оптимизирует, gcc обычно нет. То, чего я не понимаю, это почему вообще чтото падает. Даже если получили адрес а потом объект удалился это никак не мешает, если только не печатаем содержимое по этому адресу и то *после* конструктора (т.е. например в деструкторе). Ну а если делаем это *после* деструктора, тогда странно, почему не падает на gcc. В чем состоится "падение"? У меня все прекрасно работает (MSVC 2010), правда я все делаю в конструкторе, а в этом случае mAddr вообще не нужна. Наверно все же нужно больше кода. |
15.04.2013, 11:43 | #6 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
По стандарту, конструкторы срабатывают при конструировании объектов. операторы присваивания - при присваивании уже существующему объекту. Это касается и гцц, и студии. всех. Можете проверить на любом компиляторе. |
|
15.04.2013, 11:49 | #7 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Уже больше суток на ногах и не вылазию из кода: Код:
Первый случай работает для обоих компиляторов и в дебаге и в релизе Второй случай падает на релизе студии. Но если в туловище конструктора поставить отладочный вывод, то второй случай тоже начинает работать корректно. Последний раз редактировалось _Bers; 15.04.2013 в 11:53. |
|
15.04.2013, 12:44 | #8 | ||
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
Код:
Цитата:
Код:
|
||
15.04.2013, 13:52 | #9 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Погоди минуточку.... Ты хочешь сказать, что данный код не корректен: http://liveworkspace.org/code/4wkRjx$7 То есть, то, что он работает, это чистое везение? Последний раз редактировалось _Bers; 15.04.2013 в 13:54. |
|
15.04.2013, 14:31 | #10 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,493
|
|
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
релиз собирается дебаг нет. | veshiyoleg | Visual C++ | 2 | 07.10.2011 20:12 |
Релиз программы! Нужен совет. | DimOn4Ik | Свободное общение | 4 | 25.06.2010 13:19 |
Посоветуйте релиз TreeView | KWN, lnc | Общие вопросы Delphi | 4 | 12.05.2009 02:55 |
Релиз ViceCity | Манжосов Денис :) | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 13 | 05.02.2008 14:18 |