Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.36.221] |
|
Страницы: (29) « Первая ... 26 27 [28] 29 ( Перейти к последнему сообщению ) |
Сообщ.
#406
,
|
|
|
Ну, если ты враг народа, то давай писать макросами
|
Сообщ.
#407
,
|
|
|
Цитата linuxfan @ Разводишь меня чтоли? Там же не присваивание, а конструктор копирования. Такое можно (и нужно) оптимизировать. Ты мне соптимизируй a = b + c. Не развожу. Что тебе запустить уже лдень да?? Так вот.. если лень, то скажу так.. конструктор копирования не выполняеться.. 3 раза выполняется конструктор по умолчанию и ВСЕ! |
Сообщ.
#408
,
|
|
|
Цитата Там же не присваивание, а конструктор копирования обычно присваивание отличается от конструктора копирования только тем, что возвращает const A &. И то это делать необязательно, а лишь для ситуаций, когда нам хочется писать a = b = c; Добавлено (тфу ты блин, Неудачник опередил) |
Сообщ.
#409
,
|
|
|
Цитата BugHunter @ обычно присваивание отличается от конструктора копирования только тем, что возвращает const A &. у присвоения A& возвращается... int a,b,c; (a = b) = c; Добавлено linuxfan На вот тебе такой код.. а то подумаеш еще что там operator= вызовется.. class A { public: A() {std::cout << "def\n";} A(const A&) {std::cout << "copy\n";} A operator+ (const A&) { return A(); } A& operator= (const A&) { std::cout << "=\n"; return *this; } }; int main() { A a1,a2; A a3 = a1 + a2; } Добавлено Верю. Но я бы не хотел пользоваться программой(тем более ОС) в которой сортировка делается при помощи макроса. И более чем уверен что такое извращение в серъезных проектах не используют. |
Сообщ.
#410
,
|
|
|
LuckLess, видимо ты меня не понимаешь: я тебе внушаю, что оверхед именно на копировании при '+' вызывается.
#include <iostream> class A { public: static bool silent; A() {if (!silent) std::cout << "def\n";} A(const A&) {if (!silent) std::cout << "copy\n";} const A operator+ (const A &arg) { A res; if (!silent) std::cout << "operator +\n"; return res; } A& operator= (const A&) { if (!silent) std::cout << "operator = \n"; return *this; } }; bool A::silent = true; int main() { A a1,a2; A a3; A::silent = false; std::cout << "First pass\n"; a3 = a1 + a2; std::cout << "Second pass\n"; a3 = a1 + a2; return 0; } Вот результат от gcc: First pass def operator + operator = Second pass def operator + operator = Вот тебе и оверхед: Два временных объекта, потому что operator + . Или ты думаешь, что написал изотерическое сложение гипотетического хрена с несуществующей редькой и доказал высокую эффективность C++? Цитата LuckLess @ И более чем уверен что такое извращение в серъезных проектах не используют. Конечно нет. Но ведь можно же. Добавлено В серьезных проектах макросы иногда используют, чтобы избежать копипаста. |
Сообщ.
#411
,
|
|
|
Цитата linuxfan @ Вот тебе и оверхед: Два временных объекта, потому что operator + . подругому сделать нельзя никак. оверхеда тут нет, так как оверхед == лишнее действие, а тут лишнего ничего нет. хочеш подругому - использую функции и ссылки или operator+=. Добавлено Цитата linuxfan @ я тебе внушаю, что оверхед именно на копировании при '+' вызывается. Я тебе дал пример с копированием. ты дал пример не с копированиема с присвоение. |
Сообщ.
#412
,
|
|
|
Цитата LuckLess @ Я тебе дал пример с копированием. Ну пардон, если я некорректно выразился. Я-то имел ввиду именно присваивание при использовании бинарного оператора. Там оверхед в создании временного объекта для хранения результата операции. По уму бы хотелось так: .... const A& operator +(const A& arg,A& res) { /* складываем как-нибудь *this и arg, помещая значение в res */ return res; } Но такая запись добавляет дополнительных хлопот по возможной очистке предварительной результата, но избегает создания временного объекта. пусть бы лучше компилер озабачивался выбором res: либо временный объект, либо сразу lvalue для рядомстоящего присваивания. |
Сообщ.
#413
,
|
|
|
Цитата linuxfan @ либо временный объект, либо сразу lvalue для рядомстоящего присваивания. Он и возвращает сразу lvalue для рядом стоящего присваиваня. и это присваивание это лвалуе использует. да, для присвоения и operator+ есть незначительный оверхед. но кто использует большие обхекты с operator+ в связке?? ну тут дело рук опять в общем |
Сообщ.
#414
,
|
|
|
Ну так это один из провалов идеологии C++. Импиративная парадигма с A& sum(const A&,const A&,A&) тут гораздо оптимальнее.
Надо пример объектов, для которых такое поведение operator+ проблема? std::string. Там неспроста с прокси-объектами и подсчетом ссылок заморачивались. Без gc с памятью при таком поведении операторов один геморрой (скажем спасибо boost::shared_ptr ) |
Сообщ.
#415
,
|
|
|
Цитата linuxfan @ Ну так это один из провалов идеологии C++. Импиративная парадигма с A& sum(const A&,const A&,A&) тут гораздо оптимальнее. никакой это не провал. для больших объектов это легко оптимизируется. для маленьких незначительно. к примеру. class BigObject { private: bool temp; std::vector<int> BigBuffer; public: BigObject () : temp(false){} BigObject operator+ (const BigObject& obj) { BigObject tempObj(obj); //тут сложение. tempObj.temp = true; return tempObj; } BigObject& operator= (BigObject& bf) { if (bf.temp) BigBuffer.swap (bf.BigBuffer);//очень быстро выполняется else BigBuffer.assign (bf.BigBuffer.begin(), bf.BigBuffer.end());//копирование данных } }; и вообще. давай уже покажи где оверхед в СРАВНЕНИИ с С! покажи код(а не надуманный пример) на С который сложно написать на С++ не потеряв в производительности. Добавлено вообще такого рода проблема - это не проблема С++ а проблема архитектуры в целом. если бы возвращаемое значение передавалось не через регистр. а вместо этого в вункцию push-ился доп. параиетр с адремов того мета, куда надо вернуть значение, то былоб значительно оптимальней. |
Сообщ.
#416
,
|
|
|
Цитата LuckLess @ в вункцию push-ился доп. параиетр с адремов того мета, куда надо вернуть значение, то былоб значительно оптимальней. Именно так. А пример сходу придумать сложно. Ведь в крайнем случае можно в C++ всегда написать точно так же как и в C. Или мы ограничиваемся чистым C++? Тогда прошу уточнить степень "чистоты" Потому как есть некоторые нестандартизованные стандартом трюки (alloca, например -- в чистом C++ подобных вещей вообще нет), за счет которых "не совсем чистый" C может вырваться вперед. |
Сообщ.
#417
,
|
|
|
Цитата linuxfan @ А пример сходу придумать сложно. Ведь в крайнем случае можно в C++ всегда написать точно так же как и в C. Чистый С++ как и Чистый С(С99). на С++ собстно будут использоватся STL и ООП в разумных ессесно пределах. на С соответственно сруктурное программирование и сишная библиотека. |
Сообщ.
#418
,
|
|
|
Ну на "чистом" языке проблематично реализовать что-либо отличное от примитивной однопоточной числодробилки, а на таких задачах я не вижу преимущества ни одного из языков.
Думаю, что очень сложно придумать такую демо-задачу. |
Сообщ.
#419
,
|
|
|
Ну давай поиграемся с COM
Навай WinAPI + Чистый язык. |
Сообщ.
#420
,
|
|
|
Я не знаю ни COM ни WinAPI Меня кормит Linux
|