1 | ||||||
Конструкторы и механизм return04.04.2014, 15:05. Показов 1731. Ответов 19
Метки нет (Все метки)
По логике, должен вызваться конструктор объекта x, этот объект вернет свою копию. Затем будет вызван копирующий конструктор объекта y. Будет вызван деструктор для x, потом для y. Может компилятор так соптимизил... Добавлено через 19 минут gcc тоже самое выводит
0
|
04.04.2014, 15:05 | |
Ответы с готовыми решениями:
19
В чем разница между return и return false/true Как сделать так, что если файл существует return true, если нет - return false Что это isOk(int s),setAge(int g){if(isOk(g){age=g;return true;}else{.;return false;}}.getName(){return name;}? Webpack собирает проект, а приложение говорит что мои конструкторы не конструкторы |
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
|
|
04.04.2014, 15:07 | 2 |
в функции вызывается конструктор по-умолчанию, вы создаете y и присваеваете ему объект с конструктором по-умолчанию - отсюда 1, потом деструктор - 4
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
04.04.2014, 15:12 | 3 |
Да.
Добавлено через 4 минуты 1 из По поводу Нет, потом конструктор копирования по возвращению из функции, а потом уже деструктор.
1
|
04.04.2014, 15:17 | 8 | |||||
Скорее всего оптимизация. Если немного попытаться обмануть компилятор то все получится как положенно:
Кликните здесь для просмотра всего текста
1
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
04.04.2014, 15:19 | 10 |
Оптимизация бывает разная. Тут в частности срабатывает вот это:
http://stackoverflow.com/quest... tudio-2010 Еще для поиска: no-elide-constructors
1
|
04.04.2014, 15:24 [ТС] | 11 |
В студии отключил отпимизации, получилось 1 2 4 4
Добавлено через 2 минуты А как вообще можно заставить компилятор не оптимизировать здесь? Т.е. есть проект, включена оптимизация, но в таких местах, допустим, критически важен вызов копирующего конструктора, как заставить компилятор здесь не оптимизировать?
0
|
04.04.2014, 15:47 [ТС] | 15 |
Только что запустил для gcc: получилось 1 2 4 2 4 4. То есть: в func() запускается конструктор объекта x, x копируется копирующим конструктором во временной объект, затем x удаляется, запускается копирующий конструктор для y, который копирует значения из временного объекта, затем временный объект удаляется, потом удаляется y. Правильно?
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
||||||
04.04.2014, 15:54 | 16 | |||||
Думаю, что если добавить static перед M x;, то оптимизатор не станет убирать x Это не решение, это просто пример, почему оптимизатор убирает x.
1
|
04.04.2014, 16:01 [ТС] | 17 |
Поставил static. Скомпилил в gcc без опций: вывод 1 2 4 4. Скомпилил в gcc с -fno-elide-constructors, получилось 1 2 2 4 4 4. Куда делать еще одна двойка и четверка при компиляции без опций? Обходимся без временного объекта? Как тогда это происходит?
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|||||||||||
04.04.2014, 16:07 | 18 | ||||||||||
Просто. Например:
1
|
04.04.2014, 16:13 [ТС] | 19 | ||||||||||||||||||||
Вот нашел здесь такое: http://rsdn.org/forum/cpp/1436516.all
А>1.
большинство реализаций скомпилируют это так, что f вернёт значение в каком-нибудь предназначенном для этого месте проца, например в специальном регистра. На Intel это обычно eax. оттуда это значение и будет сохранено в переменную a. А>2.
Строчка "qwe" выделится в сегменте статических данных и будет там спокойно жить, когда функция затеет его возвращать, она вернёт просто сам указатель, то есть тоже как атомарное значение, то есть всё будет очень похоже на п 1, только значение будет передаваться другое. Оно же и сохранится в str. Правда есть одно замечание. В C++ "qwe" имет тип const char [4], так что чтобы всё было по стандарту, нужно писать ещё и выделенное полужирным const А>3.
А вот тут будет плохо! char qw[] = "qwe"; -- это объявление автоматического массива из 4-х char'ов, и инициализация его кодами букв q, w, e и 0. После чего адрес этого массива (то есть адрес данных на стеке), будет возвращён из функции так же как был возвращён адрес во втором случае. Но, так как стековый фрейм f будет к этому моменту разрушен, то эти данные довольно скоро будет затёрты какими-нибудь другими пользователями стека, так что вы получити какой-то мусор. Но есть ещё и 4
Произойдёт интересно. Так как структура IntData довольно большая, то она уже скорее всего не сможет быть передана через "волшебное место" в процессоре, так что она будет передаваться через память. Обычно это происходит так: 1) Тот кто вызывает, заводит у себя место под возвращаемое значние функции. Если компилятор не совсем того, то в данном контексте это будет непосредственно место под переменную data. 2) у функции f() на самом деле есть тайный параметр, куда передаётся указатель на это место 3) в операторе return будет вызван конструктор IntData, при этом объект будет сконструирован как раз в том самом месте. В этом варинте функции позовут конструктор копирования. 4) Вызывающая сторона сама решает как распорядиться полученным временным объектом. В жанном варианте (если компилятор не совсем того), то временного объекта вообще не будет и мы просто получим инициализированную переменную data и программа продолжит выполнение. Сообщение довольно старое. Этому можно верить? Сейчас тоже так все происходит?
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
04.04.2014, 16:18 | 20 |
Да.
То, что я написал про Если вдаваться в детали, то вызов func все равно может быть в наличии. Но работать он будет с объектом постоянным, а не временным. Но для простоты я написал так, чтобы объяснить, почему не будет конструктора копирования
1
|
04.04.2014, 16:18 | |
04.04.2014, 16:18 | |
Помогаю со студенческими работами здесь
20
Что такое в jquery и java return false и return true Односвязный список - объясните, как работают return 0 и return 1 saeco royal classic заварной механизм дергается рывками, машина останавливается с ошибкой, в тестовом режиме заварной механизм двигается нормально, в рабочем - н How can to return value (return value; ) of javascript function to ASP ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |