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

Default copy constructor - C++

Восстановить пароль Регистрация
 
 
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2137 / 970 / 223
Регистрация: 30.11.2013
Сообщений: 3,240
21.08.2015, 15:33     Default copy constructor #1
Что default copy constructor делает, из-за чего мой NRVO выводит разные адресса, если оставить его по умолчанию. А если переопределить пустым - работает "как требовалось" от оптимизации.

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
41
#include <iostream>
using namespace std;
 
class sshow
{
public: 
    void show()
    {
        cout << this << endl;
    }
};
class sameAdress : public sshow
{
public:
 
    sameAdress( ) = default;
    sameAdress( const sameAdress& )
    {
        cout << "Я не вывожусь, но влияю как-то, если меня закомментировать/разкоментировать ... .";
    }   
};
class diffAdress : public sshow
{
 
};
 
template <typename T>
T bar()
{
    T local_foo; local_foo.show(); return local_foo;
}
 
int main()
{
    sameAdress f = bar<sameAdress>( );
    f.show();
 
 
    diffAdress r = bar<diffAdress>( );
    r.show();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
21.08.2015, 16:42     Default copy constructor #2
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Я не вывожусь, но влияю как-то, если меня закомментировать/разкоментировать.
Ты имеешь в виду влияние на вывод адресов?

Добавлено через 23 минуты
Могу ошибаться, но мне кажется RVO тут не при чём.
Думаю суть в том, что сам метод с его строкой как то влияет на размер, и, соответственно адреса объектов.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
21.08.2015, 16:44     Default copy constructor #3
Посмотрел ассемблер, у меня gcc вообще без оптимизаций вот что сделал (ксати у меня разницы нет - закоменчена строка или нет, но в любому случае она не печатается) - заранее созданный объект копируется на стек, для него вызывается bar (т.е. он аргументом передается), потом для него же show(), потом для него же bar (но инстанс bar'а уже для diffAdress) и последнее show уже вызывается для другого, заранее созданного объекта
Вобщем тут на все воля компилятора )
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
21.08.2015, 16:48     Default copy constructor #4
Полагаю все дело в сигнатуре конструктора.
Объект имеет конструктор принимающий константную ссылку на тот же тип. Поэтому компилятор видит, что временный объект при возвращении не будет изменен и применяет оптимизацию возвращаемого значения. Исходя из этого получаем, что адресса объектов типа sameAdress равные. Для конструктора копирования по умолчанию похоже компилятор не может применить подобные рассуждения и поэтому происходит глубокое копирование (возможно по умолчания генерируется конструктор с сигнатурой diffAdress(diffAdress& ), но однозначно утверждать не стану).
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2137 / 970 / 223
Регистрация: 30.11.2013
Сообщений: 3,240
21.08.2015, 16:48  [ТС]     Default copy constructor #5
https://ideone.com/U4VWaf с конструктором копирования
C++
1
2
3
4
0xbffcdfdd
0xbffcdfdd
0xbffcdfdf
0xbffcdfde
https://ideone.com/N4FNb4 без
C++
1
2
3
4
0xbfdd4d6f
0xbfdd4d6c
0xbfdd4d6e
0xbfdd4d6d
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2137 / 970 / 223
Регистрация: 30.11.2013
Сообщений: 3,240
21.08.2015, 17:43  [ТС]     Default copy constructor #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вобщем тут на все воля компилятора
Аминь. ))

Добавлено через 54 минуты
Цитата Сообщение от castaway Посмотреть сообщение
Ты имеешь в виду влияние на вывод адресов?
Да, я подразумеваю, что есть объект А (адресс 1010) в стеке. Далее туда с вызовом метода пушится объект local_foo (1020). После NRVO объект A является объектом local_foo без копирования. Адресс А я надеялся будет (1010).
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
21.08.2015, 17:50     Default copy constructor #7
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Да, я подразумеваю, что есть объект А (адресс 1010) в стеке. Далее туда с вызовом метода пушится объект local_foo (1020). После NRVO объект A является объектом local_foo без копирования. Адресс А я надеялся будет (1010).
Ты усложняешь задачу и запутываешь условие.
Твой пример не связан с тем что ты сказал по наименованию переменных.
Упрости пример до минимального и предоставь его с таким же описанием. Будет проще разобраться в твоей ситуации.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2137 / 970 / 223
Регистрация: 30.11.2013
Сообщений: 3,240
21.08.2015, 18:12  [ТС]     Default copy constructor #8
Цитата Сообщение от castaway Посмотреть сообщение
Упрости пример
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
#include <iostream>
using namespace std;
 
class foo
{
public:
    foo()
    {       
    }
    /*foo( const foo& )
    {
    cout << "foo::foo( const foo& )\n";
    }*/
    
};
 
foo bar()
{
    foo local_foo;  cout << &local_foo << endl; return local_foo;
}
 
int main()
{
    foo f = bar();
    cout << &f << endl;
}
Добавлено через 17 минут
что-то у меня закрались сомнения: кто мне объязан сохранить адресс? Компилятору легче "сделать f псевдонимом local_foo и продлить ему жизнь в стеке запретив очистку данного объекта* (очистку стека вызывающей функцией всех ресурсов, которые она положила в стек) ).
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
21.08.2015, 19:10     Default copy constructor #9
Я был не прав. Компилятор делает своё дело. Ситуация с RVO (и другими оптимизациями) остаётся на рассмотрение компилятора.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2137 / 970 / 223
Регистрация: 30.11.2013
Сообщений: 3,240
21.08.2015, 20:07  [ТС]     Default copy constructor #10
Цитата Сообщение от castaway Посмотреть сообщение
с RVO
Да и с move semantic тогда вопрос:
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
#include <iostream>
#include <memory>
using namespace std;
 
class foo
{
public:
    foo()
    {
    }
    foo(const foo&)
    {
        cout << "copy" << endl;
    }
    foo(const foo&&)
    {
        cout << "move" << endl;
    }
 
};
 
foo bar()
{
    foo local_foo;  cout << &local_foo << endl; return std::move(local_foo);
}
 
int main()
{
    foo f = bar();
    cout << &f << endl;
}
Ведь лежит уже в стеке local_foo который "мувится" в вот-вот создаваемый объект. Зачем создавать f, почему не использовать "готовый", которого отдавали тебе как барашку вовремя жертвоприношении.

hoggy, DrOffset, можете подсказать?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
21.08.2015, 20:14     Default copy constructor #11
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Ведь лежит уже в стеке local_foo
Да не лежит там никакого local_foo. Там просто нечему лежать. Пустые класс/структура/объединение - это всего лишь абстракция для компилятора, которому нечего "класть" в стек в данном случае.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
21.08.2015, 20:15     Default copy constructor #12
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
А если переопределить пустым - работает "как требовалось" от оптимизации.
MSVS в обоих случаях выводит разные адреса.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
21.08.2015, 20:18     Default copy constructor #13
hoggy, DrOffset, придите уже наконец и подскажите нам, бестолковым, что не так.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
21.08.2015, 20:22     Default copy constructor #14
Цитата Сообщение от Dani Посмотреть сообщение
MSVS в обоих случаях выводит разные адреса.
(с отключеной оптимизацией, с включенной - все также)
rikimaru2013
21.08.2015, 20:23  [ТС]
  #15

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
уже
Тебе смешно, а я потом засыпаю после не решёных вопросов по С++ с мыслью, что я гавнокодер

castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
21.08.2015, 20:53     Default copy constructor #16

Не по теме:

rikimaru2013, у тебя неверное представление о плохом коде. Твоя тема не имеет к этому отношения. Твоё желание понять далеко не элементарные вещи должно только способствовать твоему засыпанию



Добавлено через 23 минуты

Не по теме:

rikimaru2013, кстати, я не шутил. В данном случае я допускаю возможность своей ошибки, т.к. я любитель, а не профессионал.

rikimaru2013
21.08.2015, 21:06  [ТС]
  #17

Не по теме:

ну получше меня

ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
21.08.2015, 21:15     Default copy constructor #18
rikimaru2013, castaway, Kastaneda, Ilot,

Кажется, что все дело в ABI касательно возможности возврата объекта через регистры.
http://www.x86-64.org/documentation/abi.pdf
Цитата оттуда:
If a C++ object has either a non-trivial copy constructor or a non-trivial
destructor, it is passed by invisible reference (the object is replaced in the
parameter list by a pointer that has class INTEGER).
И действительно, если вместо нетривиального конструктора копирования написать такой же деструктор, то поведение не изменится.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
21.08.2015, 21:24     Default copy constructor #19
ct0r, так тут говорится про передачу аргументов, вроде к делу не относится. Или я чего-то не вижу?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2015, 21:27     Default copy constructor
Еще ссылки по теме:

ошибка cannot find default constructor C++
что делает copy constructor? C++
C++ Copy constructor

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

Или воспользуйтесь поиском по форуму:
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
21.08.2015, 21:27     Default copy constructor #20
Цитата Сообщение от Kastaneda Посмотреть сообщение
ct0r, так тут говорится про передачу аргументов, вроде к делу не относится. Или я чего-то не вижу?
Там еще сноска есть.
An object with either a non-trivial copy constructor or a non-trivial destructor cannot be
passed by value because such objects must have well defined addresses. Similar issues apply
when returning an object from a function.
Yandex
Объявления
21.08.2015, 21:27     Default copy constructor
Ответ Создать тему
Опции темы

Текущее время: 09:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru