Показать полную графическую версию : Как стать программистом: часть первая, нравоучительная
http://www.kalinin.ru/programming/abstract/15_02_02.shtml
Не со всем я там согласен, но всё же очень уважаю Андрея Калинина (kalinin.ru) -- его заметки достаточно сильно повлияли на моё программисткое мировозрение (я ведь, по сути, ещё совсем новичёк).
Кстати, он там организовал небольшоё дайджест -- часто попадаются интересные ссылки (хотя бы про перегрузку пробела (http://www.kalinin.ru/digest/18.01.02.shtml) в C++), обычно хотя бы частично вязанные с программированием.
Добавлено:
хотя бы частично вязанные с программированием.
:lol: Ну вы меня поняли.
Apis.NET
25-02-2002, 10:35
ivank Не а не понял!
Вообще, на мой взгляд возможность переопределения операторов (таких, как сложение или умножение) скорее недостаток языка, чем достоинство: от всех этих изысков крыша у программиста, читающего исходник, сносится практически мгновенно
это не так, имхо.
приятнее читать запись типа c = a + b * d, нежели c = a.Add(b.Mul(d))
единтсвенно, перегрузку нестандартная, тогда да, но не всегда :D
хотя страница у него хорошая, часто посматриваю
Apis.NET
ivank Не а не понял!
а ты переопредели оператор понимая, сразу догонишь :lol:
VuDZ
хотя страница у него хорошая, часто посматриваюА кто тебе на него ссылку дал? Уж не я ли? :)
приятнее читать запись типа c = a + b * d, нежели c = a.Add(b.Mul(d))
На само деле, второй вариант, обычно производительнее. Т.к. тогда можно самому контролировать создание временных объектов:c = a + b * d;
Два временных объекта: (b*d) и (a + (тут первый временный объект)).
В случае:Assign( &c, Add( a, Mul( b, d ) ) );тоже два временных объекта: то что вернйт Mul( b, d ) и что вернёт Add( a, Mul( b, d ) )
Но мы можем это прооптимайзить это ручками:Assign( &c, Multiply_Add( b, d, a ) )
Уже один временный объект. Или дальше:Multiply_Add_Assign( b, d, a, &c );
Ни одного. Т.е. они скорее всего будут, но будут спрятаны внутри этой функции, и скорее всего, как-то прооптимизированы программистом.
С операторами такое не прокатит. Хотя, я недавно прочитал "Дизай и эволюци C++" by Straustrup, так он хотел ввести перегрузку нескольких операторов сразу. Т. ечто-то вроде этого:class some_class
{
some_class & operator = + * ( const some_class & a,
const some_class & b,
const some_class & d );
}
И теперь c = a + b * d будет полным аналогом Multiply_Add_Assign( b, d, a, &c ); Только гораздо приятнее выглядеть... Не помню почему это отклонили, но предложение интересное.
Добавлено:
Что-то я увлёкся -- в тему "Как стать программистом..." это не катит
тэкс... что-то мне начали читать лекции по оптимизации кода :<
ivank
А кто тебе на него ссылку дал? Уж не я ли?
не-а... если помнишь статью у меня на сайте о правилах преобразования выражений типа int (*(*(*fptr)())[3])();
то она была раньше
не-а... если помнишь статью у меня на сайте о правилах преобразования выражений типа int (*(*(*fptr)())[3])(); Это вообще Наумочкин :), правда его Калинин перепечатывал. Так вот, ссылку на авторские проекты (и на Калинина в том чисе) я тебе давал ещё до того, как ты сделала страницу. Можешь хистори в асе посмотреть.
тэкс... что-то мне начали читать лекции по оптимизации кода :<
Ну ты мб (скорее, точно) это знаешь, а вот остальные... А вот про перегрузку нескольких операторов ты наверняка не знал =)
Ну ты мб (скорее, точно) это знаешь, а вот остальные... А вот про перегрузку нескольких операторов ты наверняка не знал =)
да, не знал, так как не сталкивался, да и особого смысла в этом нет
оффтопик: склероз, всё возможно
на счёт операции c = a + b * d;
1. temp = b * d;
2. c = temp + a;
как вилишь, тут особо оптимизировать нечего, ну да ладно.
PS так как там поживают holywars?
Как нечего? Допустим, у нас есть гипотетичесский операторclass some_class
{
* * some_class & operator = + * ( const some_class & a,
* * * * * * * * * * * * * * * * * const some_class & b,
* * * * * * * * * * * * * * * * * const some_class & d );
}
Реализация номер 1:*this = a + b * d;два временных объекта.
Реализация номер 2:*this = b;
*this *= d;
*this += a;
Ни одного временного объекта.
Добавлено:
PS так как там поживают holywars?
Прекрасно :)
ты знаешь, можно ведь использовать и +=, если данные не важны:
b *= c;
a += b;
и всё :>
VuDZ
Если написать
b *= c;
a += b;
c = a;
То ты получшишь, тот же резульятат, что и:c = b;
c *= d;
c += a;Только ещё и b и a попортишь.
Если б можно было перегружать последовательность операторов, то c = a + b * d; смотрелось бы лучше (привычнее), а эффективно было бы так же.
ivank
Если б можно было перегружать последовательность операторов, то c = a + b * d; смотрелось бы лучше (привычнее), а эффективно было бы так же.
И так, у нас 4 осн. оператора,которые могуь быть в 2х местах - итого 16 перестановок. Всё возможно, но я бы предпочёл тогда уже реализовывать всю формулу,и вообще мы отвлеклись от темы
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.