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

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

Войти
Регистрация
Восстановить пароль
 
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
#1

Конструкторы копии и перемещения - C++

21.02.2013, 14:15. Просмотров 780. Ответов 2
Метки нет (Все метки)

Объясните, пожалуйста, следующее поведение.
Итак, есть 4 кода:
1:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <string>
 
 
int i;
 
class mClass {
 public:
   mClass( const mClass &orig ) {
       std::cout << ++i << " copy ctor of: " << orig.s << std::endl;
      
       s = "copy of " + orig.s;
   }
   
   mClass( const char *str )
      : s( str ) 
   {
      std::cout << ++i << " ctor: " << s << std::endl;
   }
   
   ~mClass() {
      std::cout << ++i << " dtor: " << s << std::endl;
   }
   
   std::string s;
};
 
mClass f() {
   return mClass( "func" );
}
 
int main() {
   {
      mClass a( f());
      
      std::cout << a.s << std::endl;
   }
   
   return 0;
}
2-ой код отличается от первого только функцией f():

C++
1
2
3
4
5
mClass f() {
   mClass c( "func" );
   
   return c;
}
3 и 4 коды отличаются от 1 и 2 соответственно только наличием конструктора перемещения, хотя, в принципе, они только для проверки теории.
Собственно конструктор перемещения:

C++
1
2
3
4
5
   mClass( mClass &&toMove ) {
      std::cout << ++i << " move ctor: " << toMove.s << std::endl;
      
      s = "moved " + toMove.s;
   }
Выводы из консолей:
1 код:
GCC 4.7.2 ( MinGW ):
Код
1 ctor: func
func
2 dtor: func
VS 2010:
Код
1 ctor: func
func
2 dtor: func

2 код:
GCC 4.7.2 ( MinGW ):
Код
1 ctor: func
func
2 dtor: func
VS 2010:
Код
1 ctor: func
2 copy ctor of: func
3 dtor: func
copy of func
4 dtor: copy of func

3 код:
GCC 4.7.2 ( MinGW ):
Код
1 ctor: func
func
2 dtor: func
VS 2010:
Код
1 ctor: func
func
2 dtor: func

4 код:
GCC 4.7.2 ( MinGW ):
Код
1 ctor: func
func
2 dtor: func
VS 2010:
Код
1 ctor: func
2 move ctor: func
3 dtor: func
moved func
4 dtor: moved func
Ключи компиляции GCC для 1 и 2: g++ -O0 main.cpp -o main
для 3 и 4 дополнительный ключ -std=c++11

Для VS использовался пустой проект, компиляции в конфигурации Debug, в подробности выставленных ключей не вдавался.

Собственно я не пойму, почему GCC так избегает конструктор копии и перемещения? Как, собственно, он вообще инициализирует объект в main? Я так же пробовал создавать объект в main в куче, результат тот же.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2013, 14:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструкторы копии и перемещения (C++):

Конструкторы - C++
Есть фрагмент кода: #include &lt;iostream&gt; using namespace std; class Counter { public: Counter operator++(int);...

Конструкторы - C++
class A { public: A() : a(10) // инициализация a { b = 3; // присвоение b } int a, b; };

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

Конструкторы С++ - C++
Всем привет, помогите довести программу до ума :) Заранее благодарю откликнувшихся :) ...

Конструкторы - C++
Пытаюсь разработайте класс представления окна на экране компьютера. В состав должны войти следующие конструкторы: -конструктор по...

Конструкторы - C++
Спроектируйте класс – “калькулятор”, предназначенный для выполнения арифметических операций с двумя операндами и добавьте в разработанный...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
21.02.2013, 14:38 #2
Насколько я понял, gcc использует оптимизацию возвращаемого значения (RVO). Попробуйте скомпилировать с ключом:

-fno-elide-constructors
1
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
21.02.2013, 15:00  [ТС] #3
Schizorb, да, так и есть. Странно, думал, что -O0 убирает все оптимизации...

Добавлено через 6 минут
Нашел статейку, может кому пригодится: http://alenacpp.blogspot.ru/2008/02/rvo-nrvo.html
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 15:00
Привет! Вот еще темы с ответами:

конструкторы - C++
Есть 2 проблемы: 1) Сказали сделать 2 конструктора: один по умолчанию, а другой-с параметрами. Какие должны быть параметры в моем...

конструкторы - C++
Доброе время суток! Помогите разобраться с конструктором. Что это такое и с чем его едят. Так как сдала лабу преподавателю, ну вроде ж...

Конструкторы - C++
У меня есть два конструктора: первый по умолчанию Circle() //Конструктор по умолчанию (инициализирует переменные) { itsRadius =...

конструкторы - C++
У меня вопрос: если программа с конструкторами, то нужно ли создавать объект в программе? И по какому синтаксису вызвать функцию, описанную...


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

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

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