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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
_Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
#1

Конструкторы и деструкторы функционального объекта - C++

03.07.2010, 12:33. Просмотров 728. Ответов 6
Метки нет (Все метки)

Привет всем. Вообщем разбирал задачу, в которой рассматривается алгоритм for_each, я решил добавить отладочный вывод в конструктор и деструктор чтобы посмотреть сколько раз они вызываются и честно говоря результат меня удивил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <algorithm>
 
using namespace std;
 
class display{
private:
    int i;
public:
    display(): i(0){ cout << "Constructor " << endl;}
    ~display(){cout << "Destructor " << endl;}
    void operator()(int x){
        cout << "a[" << i++ << "] = " << x << endl;
    }
};
 
int main(){
    const int N = 4;
    int a[N] = {7, 6, 9, 2};
    for_each(a, a + N, display());
    for_each(a, a + N, display());
    
    return 0;
}
кто-нибудь может объяснить почему вызывается один конструктор и 3 деструктора? (в данном конкретном случае)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2010, 12:33     Конструкторы и деструкторы функционального объекта
Посмотрите здесь:

Конструкторы/Деструкторы - C++
Доброго времени суток! Есть проблемка... после выполнении программа вылетает (без ошибок, просто выбивает в Windows программирую на BC...

Конструкторы и деструкторы - C++
Не понимаю, как закончить программу. Написала конструктор и деструктор, хотя он тут и не нужен по идее. Но по заданию сделала. А как...

Конструкторы и деструкторы - C++
#include &lt;iostream&gt; #include &lt;Windows.h&gt; class Try { public: void* px; Try() { printf(&quot;Try\n&quot;); px=malloc(12); }; ...

Конструкторы/Деструкторы. Дружественные функции - C++
Здраствуйте! Учусь на 1 курсе физфака МГУ им. Ломоносова. Начали изучать С++. Вот есть задача, точнее д.з. Можете мне помочь, пожалуйста....

Конструкторы и Деструкторы в С++. Не могу разобраться( - C++
Помогите пожалуйста разобраться с конструкторами и деструкторами в с++. Не пойму , как ними пользоваться . Вот , например у меня есть код :...

Конструкторы, Деструкторы. вывод на экран - C++
Здравствуйте уважаемые форумчане! Из книги взял пример кода по конструкторам. Вот код: #include &lt;cstdlib&gt; #include &lt;iostream&gt; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
03.07.2010, 17:10     Конструкторы и деструкторы функционального объекта #2
Создаются объекты ещё конструктором копирования.
C++
1
display(const display&) { cout << "Copy Constructor " << endl;}
В g++/Dev-C++ попробовал - 1 создание, 1 копирование, 2 деструктора. Так понимаю, что создаётся в display(), потом копируется первый раз при передаче в функцию for_each по значению, второй раз в return'е из for_each (она же возвращает свой 3-й параметр). Количество вызовов конструкторов/деструкторов при возврате из функции в общем может зависеть от уровня оптимизации. Где тут может появиться ещё одно копирование, точно не знаю.
Далее чисто догадки. Например, если в for_each что-то типа
C++
1
2
3
4
5
6
for_each(,,f)
{
t = f;
for (...) f(...);
return t;
}
то тут может быть копирование в t = f.
Однако, запуск варианта с
C++
1
for_each(a, a + N, display())(999)
и вывод a[2009226388] = 999 О_о подсказывает, что тут что-то интереснее.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,931
Завершенные тесты: 1
03.07.2010, 17:28     Конструкторы и деструкторы функционального объекта #3
Цитата Сообщение от Somebody Посмотреть сообщение
Количество вызовов конструкторов/деструкторов при возврате из функции в общем может зависеть от уровня оптимизации.
Строго говоря, это неверно. Другое дело, что хороший оптимизатор зачастую довольно хорошо выкидывает ненужные команды из получившейся последовательности вызовов, особенно когда имеем дело с несложными объектами и тривиальными конструкторами-деструкторами.
Тем не менее, если мы определим "стучащие" конструкторы-деструкторы для какого-то объекта, который передаём в функцию по значению, да и вообще проделываем с ним разные интересные манипуляции, то полученный отчёт о последовательности операций не будет отличаться для отладочного варианта, в котором полностью отключена оптимизация, и для релиза, какие настройки оптимизации в нём ни выставляй.
_Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
04.07.2010, 04:24  [ТС]     Конструкторы и деструкторы функционального объекта #4
Добавил конструктор копирования
C++
1
display(display& ) {cout << "Copy constructor" << endl;}
теперь Вызываются 2 конструктора (1 обычный, 1 копирования), и 2 деструктора. Убираю конструктор копирования - вызывается один конструктор и 3 деструктора. Окончательно запутался
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
04.07.2010, 11:59     Конструкторы и деструкторы функционального объекта #5
Цитата Сообщение от Nick Alte Посмотреть сообщение
Тем не менее, если мы определим "стучащие" конструкторы-деструкторы для какого-то объекта, который передаём в функцию по значению, да и вообще проделываем с ним разные интересные манипуляции, то полученный отчёт о последовательности операций не будет отличаться для отладочного варианта, в котором полностью отключена оптимизация, и для релиза, какие настройки оптимизации в нём ни выставляй.
Это почему это? Некоторые копирования при оптимизации можно убрать, это разрешено:
http://www.open-std.org/jtc1/sc22/op...tml#class.copy
Whenever a class object is copied and the original object and the copy
have the same type, if the implementation can prove that either the
original object or the copy will never again be used except as the
result of an implicit destructor call (_class.dtor_), an implementa-
tion is permitted to treat the original and the copy as two different
ways of referring to the same object and not perform a copy at all.
In that case, the object is destroyed at the later of times when the
original and the copy would have been destroyed without the
optimization.
И пример
http://en.wikipedia.org/wiki/Return_value_optimization
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,931
Завершенные тесты: 1
04.07.2010, 12:57     Конструкторы и деструкторы функционального объекта #6
Можно убирать копирования, но не вызовы конструктора копирования. То есть, если у нас в конструкторе и деструкторе выполняются какие-то дополнительные действия (например, вывод диагностических сообщений), эти действия будут выполнены в одном и том же порядке независимо от оптимизации. Другое дело, что сами операции копирования при этом успешно могут быть заоптимизированы "в нуль".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2010, 21:37     Конструкторы и деструкторы функционального объекта
Еще ссылки по теме:

Ошибка в нескольких строчках. Конструкторы и деструкторы - C++
Какие ошибки в фрагменте кода? Что нужно вычеркнуть? class X { int i; double t; x() { i=0; t=1.0; cout&lt;&lt;1; } public:

Классы, Конструкторы, Деструкторы. Отредактировать программу - C++
#include &lt;iostream&gt; #include &lt;string&gt; #ifndef STUDENTH #define STUDENTH #endif using namespace std; const int...

Конструкторы/деструкторы. Помогите прокомментировать код - C++
massiv massiv::sum(massiv mas1){ int f=0,j,h=0; massiv mas3(mas1.n+this-&gt;n); // for(int i=0;i&lt;mas1.n;i++) mas3.mas=mas1.mas;...

Создать класс, используя конструкторы и деструкторы - C++
Создайте класс, одно из полей которого хранит «порядковый номер» объекта, т.е. для первого созданного объекта значение этого поля равно 1,...


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

Или воспользуйтесь поиском по форуму:
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
04.07.2010, 21:37     Конструкторы и деструкторы функционального объекта #7
Цитата Сообщение от Nick Alte Посмотреть сообщение
Можно убирать копирования, но не вызовы конструктора копирования. То есть, если у нас в конструкторе и деструкторе выполняются какие-то дополнительные действия (например, вывод диагностических сообщений), эти действия будут выполнены в одном и том же порядке независимо от оптимизации. Другое дело, что сами операции копирования при этом успешно могут быть заоптимизированы "в нуль".
Хотя, действительно, строчки стандарта какие-то мутные и прямо явно такого не говорят, но тогда на фига в стандарте всё это? Оптимизация с сохранением всех побочных эфеектов и без этого возможна, а здесь как раз говорится, что можно убрать копирование (вместе с конструктором копирования, естественно).
Yandex
Объявления
04.07.2010, 21:37     Конструкторы и деструкторы функционального объекта
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru