Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2015, 17:23   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию Передача временного обьекта в функцию

Всем доброго дня !

В функцию void hgh(Ca v) передаю временной обьект как значение.

В Microsoft Visual C++ 6.0 при выводе получаю:
attachment.php.jpg

В онлайн компиляторе http://ideone.com/yjNGO2

копирования нет (нету доп. вызова деструктора)

Кто-же из них прав ?

Код:
#include <conio.h>
#include <stdio.h>
#include<vector>
#include<algorithm>
 
 
using namespace std;


 
class Ca
 
{
public:
 
    Ca()  {printf("\nKONST this = %p\n",this);}
	~Ca() {printf("\nDEST this = %p\n",this);}
};

void hgh(Ca v);

int main()
 
{
   hgh(Ca());
	getch();
	return 0;
}

void hgh(Ca v)

{
	printf("\nhgh() = %p\n",&v);
}

Последний раз редактировалось Stilet; 08.08.2015 в 17:32.
RAFA91 вне форума Ответить с цитированием
Старый 08.08.2015, 17:33   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Чет я не понял, что смутило?
Указатели разные?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.08.2015, 17:56   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Microsoft Visual C++ 6.0
Вы где это откопали? Закапывайте обратно.

Вообще такое вроде бывает из-за оптимизаций компилятора, может выкинуть копирование если ни на что не влияет.

Цитата:
Чет я не понял, что смутило?
Указатели разные?
При передаче в функцию по значению объект должен скопироваться (вызовется конструктор копирования созданный по умолчанию) и соответственно потом он должен уничтожиться, вот автор и ожидает 2 записи о вызове десктруктора как на скриншоте.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 08.08.2015 в 18:05.
Alex11223 вне форума Ответить с цитированием
Старый 08.08.2015, 18:20   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А-а-а... Как-то не сразу на это внимание обратил. Ну я не думаю, что MVC в данном случае выступает гарантом стандарта.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.08.2015, 18:42   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не, ну копирование это ж самые основы С++, это не то, что может быть реализовано в одном компиляторе, но отсутствовать в другом.

Но как я и говорил, компилятор при оптимизации может выкинуть копирование, которое ни на что не повлияет.

https://en.wikipedia.org/wiki/Copy_elision
http://stackoverflow.com/questions/1...ructor-elision
http://stackoverflow.com/questions/1...e-optimization
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.08.2015, 08:30   #6
-=ЮрА=-
C/C++ advanced
Пользователь
 
Аватар для -=ЮрА=-
 
Регистрация: 17.11.2011
Сообщений: 17
По умолчанию

Alex11223, всё там есть http://codepad.org/3DAKb6Ir (ideone мог соптимизирвоать код )
Цитата:
Вы где это откопали? Закапывайте обратно.
- не соглашусь отличная IDE даже учитывая её отклонения от стандрта до сих пор позволяет создавать GUI на всю линейку виндовс от 98 до 10-ки.

PS:RAFA91, ещё не надоело мусолить этот код?На кибере им все глаза выел, теперь тут, что ты с ним хочешь сделать - обычный класс.Вообще без особенностей, нет там никаких невидимых объектов

Вот ещё раз ideone
http://ideone.com/muxndF - вообще баг (ни КК не вызывался не опреатор присваивания)
http://ideone.com/pqr6IT тоже самое, что и http://codepad.org/3DAKb6Ir, так что скорей всего в компиляторе ideone - баг приводящий к утечке памяти именно для временных объектов, либо супер оптимизация(которая всё равно нестандартна)
За "хлеб и воду" не работаю

Последний раз редактировалось Stilet; 09.08.2015 в 11:21.
-=ЮрА=- вне форума Ответить с цитированием
Старый 09.08.2015, 10:24   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Какой еще баг? Выше ссылки на описание этой оптимизации. По второй ссылке цитата из стандарта (12.8.31), где говорится, что для временных объектов такая оптимизация разрешена.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.08.2015, 11:20   #8
-=ЮрА=-
C/C++ advanced
Пользователь
 
Аватар для -=ЮрА=-
 
Регистрация: 17.11.2011
Сообщений: 17
По умолчанию

Цитата:
Какой еще баг? Выше ссылки на описание этой оптимизации. По второй ссылке цитата из стандарта (12.8.31), где говорится, что для временных объектов такая оптимизация разрешена.
- я ничего по тем ссылкам не увидел ссылка на очередной мусорник stackoverflow(почему-то перенаправляя на какой-нибудь англоязычный форум все считают, что там не пишут дерьма, пишут, да ещё и как пишут). Ещё раз повторяю - ideonecom оптимизировал
void hgh(Ca v); как void hgh(Ca &v); и это БАГ а НЕ ФИЧА.
Цитата:
when a temporary class object that has not been bound to a reference would be copied/moved to a class object with the same cv-unqualified type, the copy/move operation can be omitted by constructing the temporary object directly into the target of the omitted copy/move
- что то я не нашёл такого в новом стандарте. Открываем вики https://en.wikipedia.org/wiki/Copy_elision идём в список источников
Цитата:
ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §12.8 Copying class objects [class.copy] para. 15
- ISO/IEC 2003, а сейчас 2015 на носу. И в любом случае такая оптимизация завист от компилятора - ЯЗЫК не может зависеть от типа компилера, так что это БАГ.
За "хлеб и воду" не работаю

Последний раз редактировалось -=ЮрА=-; 09.08.2015 в 11:29.
-=ЮрА=- вне форума Ответить с цитированием
Старый 09.08.2015, 11:51   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

https://isocpp.org/std/the-standard
последний черновик, все там есть в 12.8.31
Ну и в 2003 видимо тоже уже было.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.08.2015, 12:29   #10
-=ЮрА=-
C/C++ advanced
Пользователь
 
Аватар для -=ЮрА=-
 
Регистрация: 17.11.2011
Сообщений: 17
По умолчанию

Alex11223, хорошо я скопировал этот пункт
Цитата:
31 When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class
object, even if the constructor selected for the copy/move operation and/or the destructor for the object
have side effects. In such cases, the implementation treats the source and target of the omitted copy/move
operation as simply two different ways of referring to the same object. If the first parameter of the selected
constructor is an rvalue reference to the object’s type, the destruction of that object occurs when the target
would have been destroyed; otherwise, the destruction occurs at the later of the times when the two objects
would have been destroyed without the optimization.123 This elision of copy/move operations, called copy
elision, is permitted in the following circumstances (which may be combined to eliminate multiple copies):
(31.1) — in a return statement in a function with a class return type, when the expression is the name of a nonvolatile
automatic object (other than a function parameter or a variable introduced by the exceptiondeclaration
of a handler (15.3)) with the same type (ignoring cv-qualification) as the function return
type, the copy/move operation can be omitted by constructing the automatic object directly into the
function’s return value
(31.2) — in a throw-expression (5.17), when the operand is the name of a non-volatile automatic object (other than
a function or catch-clause parameter) whose scope does not extend beyond the end of the innermost
enclosing try-block (if there is one), the copy/move operation from the operand to the exception
object (15.1) can be omitted by constructing the automatic object directly into the exception object
(31.3) — when a temporary class object that has not been bound to a reference (12.2) would be copied/moved to
a class object with the same type (ignoring cv-qualification), the copy/move operation can be omitted
by constructing the temporary object directly into the target of the omitted copy/move
(31.4) — when the exception-declaration of an exception handler (Clause 15) declares an object of the same type
(except for cv-qualification) as the exception object (15.1), the copy operation can be omitted by
treating the exception-declaration as an alias for the exception object if the meaning of the program will
be unchanged except for the execution of constructors and destructors for the object declared by the
И примечание
Цитата:
123) Because only one object is destroyed instead of two, and one copy/move constructor is not executed, there is still one
object destroyed for each one constructed
- т.е компилер может но не должен провести оптимизацию - лично мне это попахивает UB
За "хлеб и воду" не работаю
-=ЮрА=- вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача в функцию указателя на функцию C Jar Помощь студентам 3 03.05.2014 16:27
Передача временного объекта в конструктор 220Volt Общие вопросы C/C++ 6 21.04.2013 10:50
Передача массива в функцию Garmon Общие вопросы C/C++ 6 23.09.2012 08:03
передача массива в функцию Fatal Error Общие вопросы C/C++ 7 09.07.2012 17:45
Передача аргументов в функцию. C++ Kholmansky Помощь студентам 2 15.09.2011 01:02