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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2011, 20:10   #11
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Объясняю по порядку. Ког8да вы передаете в качестве параметра объект по значению, то 1) вызывается конструктор для этого объекта; 2) при завершении оператора-функции вызывается деструктор этого объекта. У вас очевидно малый опыт программирования, но порой объекты бывают достаточно сложные. Например, конструкторы могут выделять память для своих членов, открытвать файлы и т.д. К тому же сами члены объекта также могут требовать вызова конструкторов и деструкторов. Кроме того в самом стеке функции должна быть выделена память под весь объект.
У меня таки большой опыт. Да и причем тут что делают конструкторы, если сами конструкторы вызываются далеко не всегда. Только, когда реально нужно 2 разных объекта, всё остальное оптимизируется. Вы совсем не поняли сути, видимо у вас очень маленький опыт программирования и вам пока это просто не понятно.

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Что касается второго вашего вопроса. Возврашение не константного объекта нарушает общепринятое представление для операций со встроенными типами. То есть общая семантика операторов нарушается. Вы же не можете выполнять такой, например, код
Код:
int x = 3, y = 4;

x + y = 5;
Такое повдение ожидают пользователи вашего кода и от вами определнных типов, то есть семантика операций должна быть идентична для встроенных типов и ваших типов. Этот принцип называется принципом наибольшей предсказуемости поведения.
Во первых это не вопрос, а ответ на ваше высказывание. И никакого общепринятого представления оно не нарушает, общепринятое представление было написано в посте #7 :
http://programmersforum.ru/showpost....44&postcount=7 И был приведен конкретный пример (A+B).func () , а не какая-то белеберда, как в вашем примере Работа со своими типами данных это совсем другое.

Последний раз редактировалось An1ka; 06.07.2011 в 21:03.
An1ka вне форума Ответить с цитированием
Старый 07.07.2011, 09:52   #12
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от An1ka Посмотреть сообщение
И был приведен конкретный пример (A+B).func () , а не какая-то белеберда, как в вашем примере Работа со своими типами данных это совсем другое.
Не соглашусь. Перегружать операторы для своих типов нужно таким образом, чтобы выполняемые ими функции соответствовали семантике оператора, и поведение было похоже на поведение оператора с базовыми типами (т.е. не надо, например, использовать operator-, который будет складывать операнды )
И подобные выражения
Цитата:
(A+B).func()
тоже не допустимы, как я считаю
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 07.07.2011, 18:17   #13
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от An1ka Посмотреть сообщение
У меня таки большой опыт. Да и причем тут что делают конструкторы, если сами конструкторы вызываются далеко не всегда. Только, когда реально нужно 2 разных объекта, всё остальное оптимизируется. Вы совсем не поняли сути, видимо у вас очень маленький опыт программирования и вам пока это просто не понятно.


Во первых это не вопрос, а ответ на ваше высказывание. И никакого общепринятого представления оно не нарушает, общепринятое представление было написано в посте #7 :
http://programmersforum.ru/showpost....44&postcount=7 И был приведен конкретный пример (A+B).func () , а не какая-то белеберда, как в вашем примере Работа со своими типами данных это совсем другое.
Вы говорите глупость! Никакой оптимизации при передачи объекта по значению, как аргумента функции, не происходит! И о какой вообще оптимизации вы говорите, если требуется создать локальный объект в стеке? Как он там появится? По мановению волшебной палочки?!

Белиберду как раз пишите вы! Я вам еще раз повторяю, что нарушается семантика операции. Что касается вашего, якобы, "конкретного" примера, то это очередная глупость! A + B - это временный объект, поэтому в принципе бессмысленно вызывать для него функции, которые его меняют! Но для временного объекта вы можете вызывать функции, которые не меняют временный объект, то есть константные. Поэтому если вам так уж нужно вызвать функцию, то вы можете записать (A + B).func(), только функция будет с квалификатором const.

Даже одного вашего ответа на первый вопрос про, якобы, какую-то оптимизацию при передачи функции объекта по значению, говорит о вашей крайней безграмотности как программиста С++. Для своих параметров функции выделяют память в стеке, куда и заносят переданные им аргументы. И работают функции именно с тем, что у них в стеке. А в стеке как-то должны появиться эти значения. Согласно же вашим безграмотным рассуждениям они там появятся неизвестно как.
Вы, как говорится, слышали звон про оптимизацию, но не знаете, где он, то есть в каких случаях эта оптимизация выполняется!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 07.07.2011, 18:19   #14
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Не соглашусь. Перегружать операторы для своих типов нужно таким образом, чтобы выполняемые ими функции соответствовали семантике оператора, и поведение было похоже на поведение оператора с базовыми типами (т.е. не надо, например, использовать operator-, который будет складывать операнды )
И подобные выражения

тоже не допустимы, как я считаю
В последнем случае это допустимо для вызова константных функций-членов, то есть тех, которые не меняют состояние временного объекта.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 07.07.2011, 19:17   #15
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
В последнем случае это допустимо для вызова константных функций-членов, то есть тех, которые не меняют состояние временного объекта.
Для временных объектов неконстантные функции-члены тоже можно вызывать. Только зачем?
still_alive вне форума Ответить с цитированием
Старый 07.07.2011, 19:20   #16
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Для временных объектов неконстантные функции-члены тоже можно вызывать. Только зачем?
Я имел в виду, если возвращать из перегруженного оператора суммирования константный объект, то при желании можно писать
(A + B).f()

При этом семантика опратора, которая имеет место быть для встроенных типов не нарушается, так как значение выражения при этом не меняется.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 07.07.2011, 19:33   #17
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

2Сыроежка
Вынужден частично согласится с An1ka, современные компиляторы очень хороши в плане оптимизаций, и могут оптимизировать возврат значения из функции так, чтобы не создавалось временных объектов. С другой стороны, не всё и не всегда удаётся оптимизировать, потому особо полагаться на эти оптимизации не стоит, тем более на те, что не гарантированы стандартом. И не стоит постоянно говорить о безграмотности друг друга, тем более вы не знакомы лично и не можете судить об этом наверняка.
2Химик, если ваши объекты становятся слишком тяжёлыми для передачи их по значению, Вы можете воспользоваться разделяемым хранилищем основных данных и подсчётом ссылок на них, как это реализовано в классе string. Детальнее на эту тему можете почитать у Страуструпа

Последний раз редактировалось netrino; 07.07.2011 в 19:35.
netrino вне форума Ответить с цитированием
Старый 07.07.2011, 19:41   #18
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
2Сыроежка
Вынужден частично согласится с An1ka, современные компиляторы очень хороши в плане оптимизаций, и могут оптимизировать возврат значения из функции так, чтобы не создавалось временных объектов. С другой стороны, не всё и не всегда удаётся оптимизировать, потому особо полагаться на эти оптимизации не стоит, тем более на те, что не гарантированы стандартом. И не стоит постоянно говорить о безграмотности друг друга, тем более вы не знакомы лично и не можете судить об этом наверняка.
2Химик, если ваши объекты становятся слишком тяжёлыми для передачи их по значению, Вы можете воспользоваться разделяемым хранилищем основных данных и подсчётом ссылок на них, как это реализовано в классе string. Детальнее на эту тему можете почитать у Страуструпа

Вы пишите очередную глупость! Читайте внимательно, что я пишу! Никакой, повторяю специально для вас, никакой оптимизации при передачи аргумента параметру по значению не происходит! Я уже несколько раз это написмал, вы тот же самый бред, как попугай, повторяете!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 07.07.2011, 20:15   #19
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Вы пишите очередную глупость! Читайте внимательно, что я пишу! Никакой, повторяю специально для вас, никакой оптимизации при передачи аргумента параметру по значению не происходит! Я уже несколько раз это написмал, вы тот же самый бред, как попугай, повторяете!
Ну тогда, быть может, Вы тоже внимательно прочтёте, что написал я?) И не нужно так нервничать, успокойтесь.
netrino вне форума Ответить с цитированием
Старый 07.07.2011, 20:22   #20
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Ну тогда, быть может, Вы тоже внимательно прочтёте, что написал я?) И не нужно так нервничать, успокойтесь.
Что я должен извлечь из прочситанного?! То, что вы не знаете языка С++? Это я вижу! Я вам еще раз повторяю, что если вы не собираетесь изменять объект, то передавайте его в функцию по константной ссылке, а не по значению. Иначе у вас будут большие накладные расходы по выделению памяти в стеке под объект и вызовы конструкторов и деструкторов. Что вам не понятно?!!! По значению можно передавать лишь встроенные типы, а не типы пользователей, которые к тому же имеют свойство во время своей жизни меняться в сторону уыеличения.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Перегрузка оператора += и >> Jane-sad Помощь студентам 4 01.03.2013 15:38
Перегрузка бинарного оператора + EC.cpp Общие вопросы C/C++ 4 10.04.2011 00:32
Перегрузка оператора + Jane-sad Помощь студентам 0 05.10.2010 13:52
перегрузка оператора -> alex_alpha Общие вопросы C/C++ 5 23.06.2010 19:07
Перегрузка оператора Crucian Общие вопросы C/C++ 2 22.10.2007 09:44