Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как стать программистом: часть первая, нравоучительная (http://forum.oszone.net/showthread.php?t=30879)

ivank 22-02-2002 23:51 210544

http://www.kalinin.ru/programming/ab...15_02_02.shtml

Не со всем я там согласен, но всё же очень уважаю Андрея Калинина -- его заметки достаточно сильно повлияли на моё программисткое мировозрение (я ведь, по сути, ещё совсем новичёк).

Кстати, он там организовал небольшоё дайджест -- часто попадаются интересные ссылки (хотя бы про перегрузку пробела в C++), обычно хотя бы частично вязанные с программированием.

Добавлено:

Цитата:

хотя бы частично вязанные с программированием.
:lol: Ну вы меня поняли.

Apis.NET 25-02-2002 10:35 210545

ivank Не а не понял!

VuDZ 02-03-2002 01:09 210546

Цитата:

Вообще, на мой взгляд возможность переопределения операторов (таких, как сложение или умножение) скорее недостаток языка, чем достоинство: от всех этих изысков крыша у программиста, читающего исходник, сносится практически мгновенно
это не так, имхо.
приятнее читать запись типа c = a + b * d, нежели c = a.Add(b.Mul(d))

единтсвенно, перегрузку нестандартная, тогда да, но не всегда :D

хотя страница у него хорошая, часто посматриваю

Apis.NET
Цитата:

ivank Не а не понял!
а ты переопредели оператор понимая, сразу догонишь :lol:

ivank 02-03-2002 01:36 210547

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 ); Только гораздо приятнее выглядеть... Не помню почему это отклонили, но предложение интересное.

Добавлено:

Что-то я увлёкся -- в тему "Как стать программистом..." это не катит

VuDZ 02-03-2002 01:54 210548

тэкс... что-то мне начали читать лекции по оптимизации кода :<

ivank
Цитата:

А кто тебе на него ссылку дал? Уж не я ли?
не-а... если помнишь статью у меня на сайте о правилах преобразования выражений типа int (*(*(*fptr)())[3])();
то она была раньше

ivank 02-03-2002 02:22 210549

Цитата:

не-а... если помнишь статью у меня на сайте о правилах преобразования выражений типа int (*(*(*fptr)())[3])();
Это вообще Наумочкин :), правда его Калинин перепечатывал. Так вот, ссылку на авторские проекты (и на Калинина в том чисе) я тебе давал ещё до того, как ты сделала страницу. Можешь хистори в асе посмотреть.

Цитата:

тэкс... что-то мне начали читать лекции по оптимизации кода :<
Ну ты мб (скорее, точно) это знаешь, а вот остальные... А вот про перегрузку нескольких операторов ты наверняка не знал =)

VuDZ 02-03-2002 02:36 210550

Цитата:

Ну ты мб (скорее, точно) это знаешь, а вот остальные... А вот про перегрузку нескольких операторов ты наверняка не знал =)
да, не знал, так как не сталкивался, да и особого смысла в этом нет

оффтопик: склероз, всё возможно

на счёт операции c = a + b * d;
1. temp = b * d;
2. c = temp + a;

как вилишь, тут особо оптимизировать нечего, ну да ладно.

[s]PS так как там поживают holywars?[/s]

ivank 02-03-2002 02:54 210551

Как нечего? Допустим, у нас есть гипотетичесский оператор
Код:

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?
Прекрасно :)

VuDZ 02-03-2002 03:03 210552

ты знаешь, можно ведь использовать и +=, если данные не важны:

b *= c;
a += b;

и всё :>

ivank 02-03-2002 11:05 210553

VuDZ
Если написать
Код:

b *= c;
a += b;
c = a;

То ты получшишь, тот же резульятат, что и:
Код:

c = b;
c *= d;
c += a;

Только ещё и b и a попортишь.

Если б можно было перегружать последовательность операторов, то c = a + b * d; смотрелось бы лучше (привычнее), а эффективно было бы так же.

VuDZ 02-03-2002 15:09 210554

ivank
Цитата:

Если б можно было перегружать последовательность операторов, то c = a + b * d; смотрелось бы лучше (привычнее), а эффективно было бы так же.
И так, у нас 4 осн. оператора,которые могуь быть в 2х местах - итого 16 перестановок. Всё возможно, но я бы предпочёл тогда уже реализовывать всю формулу,и вообще мы отвлеклись от темы


Время: 18:58.

Время: 18:58.
© OSzone.net 2001-