Russian Qt Forum
Ноябрь 24, 2024, 23:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Глюк QList или моя ошибка  (Прочитано 9981 раз)
brankovic
Гость
« Ответ #15 : Январь 13, 2011, 23:57 »

Есть структура...

А на винде дело-то? А то на линуксах тупо valgrind запустил, часто сразу понятно, что не так..
Записан
ритт
Гость
« Ответ #16 : Январь 15, 2011, 19:32 »

ну вообще-то будет, по умолчанию происходит что-то типа memcpy насколько я знаю, а конструкторы кустрингов вроде не вызовуться
мета-тип не примитив и не мувэйбл - memcpy происходить не будет.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #17 : Январь 15, 2011, 21:05 »

2) в данном случае будет вызываться не конструктор копирования, а оператор присваивания.
тут нужно быть по осторожнее т.к. теория может расходится с практикой (оптимизация компилятора)
Тыц
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Январь 15, 2011, 23:48 »

2) в данном случае будет вызываться не конструктор копирования, а оператор присваивания.
тут нужно быть по осторожнее т.к. теория может расходится с практикой (оптимизация компилятора)
Тыц
Как пояснил Rcus - это стандартная оптимизация практически для всех современных компиляторов.
Код
C++ (Qt)
MyObject CreateObj( void )   // наглое возвращение объекта по значению
{
MyObject obj;
return obj;
}
...
MyObject theObj = CreateObj();
 
Здесь компилятор не позовет деструктор для локального obj, итого будет вызван всего 1 конструктор MyObj. Однако никакая оптимизация не заменяет конструирование на присваивание или наоборот, напр
Код
C++ (Qt)
theObj = CreateObj();  // theObj был объявлен выше
 
А вот здесь как ни оптимизируй, а будет вызван оператор присваивания и деструктор
Кстати интересно проверить (для первого случая) - а что будет если конструктор копирования и по умолчанию чем-то различаются?

Edit; наверное правильнее сказать: в первом случае локальный obj вообще не создается, а сразу используется "место назначения" (theObj)
« Последнее редактирование: Январь 15, 2011, 23:57 от Igors » Записан
brankovic
Гость
« Ответ #19 : Январь 16, 2011, 00:34 »

Edit; наверное правильнее сказать: в первом случае локальный obj вообще не создается, а сразу используется "место назначения" (theObj)

Именно. Только это не "какая-то оптимизиция некоторых компиляторов", это разрешено и поощряется стандартом, называется copy constructor elision. Даже если конструктор копирования и конструктор по умолчанию различаются, компилятор имеет право бездумно сократить, опять в соответствии со стандартом. Гарантий нет. Вплоть до того, что на разном уровне оптимизации будет работать по-разному.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Январь 16, 2011, 01:07 »

Именно. Только это не "какая-то оптимизиция некоторых компиляторов",
Я такого не говорил, наоборот  Улыбающийся

Даже если конструктор копирования и конструктор по умолчанию различаются, компилятор имеет право бездумно сократить, опять в соответствии со стандартом. Гарантий нет. Вплоть до того, что на разном уровне оптимизации будет работать по-разному.
Хммм... интересно разобраться. Представим ситуацию когда:

- конструктор по умолчанию заводит новый shared объект (указатель на него - член класса)
- конструктор копирования только увеличивает число ссылок на него (как и оператор присваивания)

И что - это будет работать по-разному?
Хотя я бы лично по значению объектов бы не возвращал (ну разве что-то типа QPoint, QRect)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.122 секунд. Запросов: 23.