Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

03.07.2010, 12:33. Просмотров 739. Ответов 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 деструктора? (в данном конкретном случае)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2010, 12:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструкторы и деструкторы функционального объекта (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++
Привет. Есть структура, содержащая 7 полей, в которые я ввожу значения с клавиатуры. Нужно используя конструкторы и деструкторы...

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

Конструкторы и деструкторы - C++
Здравствуйте уважаемые программисты, помогите пожалуйста новичку? Не могу разобраться в программе, где смог там написал комментарий и то не...

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

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

6
Somebody
2791 / 1602 / 148
Регистрация: 03.12.2007
Сообщений: 4,200
Завершенные тесты: 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 О_о подсказывает, что тут что-то интереснее.
0
Nick Alte
Эксперт С++
1643 / 1015 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
03.07.2010, 17:28 #3
Цитата Сообщение от Somebody Посмотреть сообщение
Количество вызовов конструкторов/деструкторов при возврате из функции в общем может зависеть от уровня оптимизации.
Строго говоря, это неверно. Другое дело, что хороший оптимизатор зачастую довольно хорошо выкидывает ненужные команды из получившейся последовательности вызовов, особенно когда имеем дело с несложными объектами и тривиальными конструкторами-деструкторами.
Тем не менее, если мы определим "стучащие" конструкторы-деструкторы для какого-то объекта, который передаём в функцию по значению, да и вообще проделываем с ним разные интересные манипуляции, то полученный отчёт о последовательности операций не будет отличаться для отладочного варианта, в котором полностью отключена оптимизация, и для релиза, какие настройки оптимизации в нём ни выставляй.
0
_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 деструктора. Окончательно запутался
0
Somebody
2791 / 1602 / 148
Регистрация: 03.12.2007
Сообщений: 4,200
Завершенные тесты: 1
04.07.2010, 11:59 #5
Цитата Сообщение от Nick Alte Посмотреть сообщение
Тем не менее, если мы определим "стучащие" конструкторы-деструкторы для какого-то объекта, который передаём в функцию по значению, да и вообще проделываем с ним разные интересные манипуляции, то полученный отчёт о последовательности операций не будет отличаться для отладочного варианта, в котором полностью отключена оптимизация, и для релиза, какие настройки оптимизации в нём ни выставляй.
Это почему это? Некоторые копирования при оптимизации можно убрать, это разрешено:
http://www.open-std.org/jtc1/sc22/open/n2356/special.html#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
0
Nick Alte
Эксперт С++
1643 / 1015 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
04.07.2010, 12:57 #6
Можно убирать копирования, но не вызовы конструктора копирования. То есть, если у нас в конструкторе и деструкторе выполняются какие-то дополнительные действия (например, вывод диагностических сообщений), эти действия будут выполнены в одном и том же порядке независимо от оптимизации. Другое дело, что сами операции копирования при этом успешно могут быть заоптимизированы "в нуль".
0
Somebody
2791 / 1602 / 148
Регистрация: 03.12.2007
Сообщений: 4,200
Завершенные тесты: 1
04.07.2010, 21:37 #7
Цитата Сообщение от Nick Alte Посмотреть сообщение
Можно убирать копирования, но не вызовы конструктора копирования. То есть, если у нас в конструкторе и деструкторе выполняются какие-то дополнительные действия (например, вывод диагностических сообщений), эти действия будут выполнены в одном и том же порядке независимо от оптимизации. Другое дело, что сами операции копирования при этом успешно могут быть заоптимизированы "в нуль".
Хотя, действительно, строчки стандарта какие-то мутные и прямо явно такого не говорят, но тогда на фига в стандарте всё это? Оптимизация с сохранением всех побочных эфеектов и без этого возможна, а здесь как раз говорится, что можно убрать копирование (вместе с конструктором копирования, естественно).
0
04.07.2010, 21:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2010, 21:37
Привет! Вот еще темы с ответами:

Конструкторы и деструкторы - C++
Необходимо реализовать класс с двумя полями, имеющими имена first и second. Обязательно должны присутствовать: Для инициализации...

Конструкторы и деструкторы - C++
Напишите простейшие примеры объявления и определения конструкторов и деструкторов. Желательно, чтобы были примеры с различными типами данных

Конструкторы и деструкторы - C++
Помогите исправить программу. Необходимо реализовать класс с двумя полями, имеющими имена first и second. Обязательно должны...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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