Шаблоны (Templates) = Generic

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Речь вообще идет о генерации кода. Компилятор С++ пишет сам Интел (да и АМД вроде тоже). Правда ссылки на более-менее реальные тесты так никто и не дал, но разница процентов в 10-20 должна быть.

Ну так прозводители процов заморачиваются новейшими фичами этих процов - странно, если бы это было по другому. Писали бы они паскаль-компиляторы - тогда бы и сравнили...

Причем тут линкер ? Просто типы и код нужно писать так, чтобы смартлинку была возможность себя проявить.

В Дельфи размер того же кода в полтора раза меньше. Это лучшее, чего удается добиться от FPC. Какой нафиг он смарт если он такой тупой?

Вы сами эспериментировали со смартлинком, что такое говорите ?
FPC-программы также сильно увеличиваются от использования WideString и Variant(150k), и это увеличение не может быть существенно уменьшено смартлинком - потому что эти модули грузят in-memory диспетчеры функций, сответственно - на момент линковки все эти функции оказываются нужны "на всякий случай".
И вообще - для смартилинка нет ничего хуже, чем использование "<type> = procedure/function" или "function1 = function2", и как раз этот механизм интенсивно используется в Лазарусе для переключения между GUI-тулкитами ( хоть команда и принимает некоторые меры).

Result:=,

Вот это язык не особо красит. Я бы заменил на Return().

Не скажите... Все таки под Result сразу выделяется память, и по ходу функции делаешь с ним что хочешь, а когда готово - "exit" .


-Fcutf8

А это чего?

Компиляция исходников, созданных в локали UTF-8. Удобно - не то слово. Можно использовать русские текстовые константы прямо в исходниках. И будет это одинаково читаться ( и печататься на принтере, ... ) и в Линуксе(koi8), и в Вынь32(cp1251).
Replicator
постоялец
Сообщения: 154
Зарегистрирован: 30.04.2006 17:14:45
Откуда: Outer Heaven
Контактная информация:

Сообщение Replicator »

Компилятор С++ пишет сам Интел (да и АМД вроде тоже).

Ага, он вообще всего один и его все пишут :lol:

Компилятор от Intel - icc, действительно, называют самым эффективным. Но во-первых, он стоит около $500 (или больше, уже не помню). Во-вторых, им мало кто пользуется - в основном g++ или, для win32, VC++. А популярный g++ практически не дает преимуществ. Да и компоновщик он использует тот же, что и fpc.
Аватара пользователя
mr.denton
новенький
Сообщения: 23
Зарегистрирован: 30.04.2006 03:23:07

Сообщение mr.denton »

debi12345 писал(а):А еще очень бы хотелось позаимствовать из С механизм "L-value", это когда работают конструкции типа

"if ( (a+=2) > 3 ) {..}".

А то в Паскале приходится где-то запоминать промежуточный результат "(a+= 2)" .

а так чем хуже?

Код: Выделить всё

a:=a+2;
if ( (a+2) > 3 ) then begin..end;

А вообще вроде fpc должен такое позволять...
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Код: Выделить всё

a:=a+2;
if ( (a+2) > 3 ) then begin..end;

А вообще вроде fpc должен такое позволять...

Вся фишка в присвоении значения с одновременным доступом к этому же значению в том же выражении - чтобы не писать "a:=a+2" .
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Цитата:
Result:=,


Вот это язык не особо красит. Я бы заменил на Return().

Нефиг
а конструкцию чего-там:=Result+1
чем менять?
всёж на одну переменную меньше объявлять
и вобще - замашки си..та надо давить в душе - не давать им вырватся наружу
а вобще это уже по моему офф-топ
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

Ну из Оберона result выкинут, а его автора трудно обвинить в си...зме.:)
По сути своей result - и есть неявная переменная. Заведя переменную Result явно добьетесь аналогичного эффекта., не забыв ее в return указать.
А вообще да, оффтопик.;)
Replicator
постоялец
Сообщения: 154
Зарегистрирован: 30.04.2006 17:14:45
Откуда: Outer Heaven
Контактная информация:

Сообщение Replicator »

Не судьба написать функцию типа:

Код: Выделить всё

function ad(var x: integer; inc_: integer = 1): integer;
begin
  Result := x + inc_;
  x := x + inc_;
end;

Сделать ее inline и использовать в циклах и т.п. Можно сделать такуюже для возвращения уже измененного значения.
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

debi12345 писал(а):Вся фишка в присвоении значения с одновременным доступом к этому же значению в том же выражении - чтобы не писать "a:=a+2" .

Фу... Долой! ;-) Имхо, не стоит. Оно, конечно, понятно, зачем это всё, но не надо. По каким правилам прикажете тогда короткие логические вычисления делать? ;-)
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Mirage писал(а):Ну из Оберона result выкинут, а его автора трудно обвинить в си...зме.:)
По сути своей result - и есть неявная переменная. Заведя переменную Result явно добьетесь аналогичного эффекта., не забыв ее в return указать.
А вообще да, оффтопик.;)


Не так все просто... если "return <var>" связана с указателями (string и т.д. ) - то по выходу из функции можете получить AccessViolation, потому что локальная <var> разрушается по выходу из функции.

Да, тем Result и хороша, что избавляет от дебильной возни с предварительным заказом памяти под строки.
Replicator
постоялец
Сообщения: 154
Зарегистрирован: 30.04.2006 17:14:45
Откуда: Outer Heaven
Контактная информация:

Сообщение Replicator »

Ну напишите функцию return(var x), которая будет делать Result := x :lol:

Зачем превращать Pascal в C?! Это разные языки. Не нравятся конструкции паскаля - С ждет-недождется. Уж там-то можно такое вытворять, отчего волосы дыбом встают. В С++ уже поняли и ушли от всякой фигни, а в Яве и подавно. А вы хотите добавить в язык совершенно ненужные ему придатки - зачем?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

В FPC уже давным-давно для желающих существует Exit(x)...
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

На момент написания сообщения стало возможным использовать дженерики, но синтаксис всё-таки выбрали ужасный... да и глюки при наследовании имеются...
GrayEddy
постоялец
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Сообщение GrayEddy »

Что и требовалось доказать... :cry:
Команда FPC = команде Lazarus'а? Все таки первая команда пошустрее будет по исправлению глюков, IMHO.
Можно привести примерчик этого "ужастика" с дженериками?
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

Вот такая вот петрушка. тестик написал...

Код: Выделить всё


 { TDE_GEN_OneWayList }

 generic TDE_GEN_OneWayList<GItemType> = class
 protected
 type
  pTListItem = ^TListItem;
  TListItem = record
   pNext: pTListItem;
   Data: GItemType;
  end;
 var
  FpHead: pTListItem;
  FpLast: pTListItem;
  FWasError: Boolean;
  procedure RaiseError(const AErrorCode: Cardinal; const pErrorData: Pointer);
 public
  pErrorProc: TDE_ErrorProc;
  procedure AddListItem(const AItemData: GItemType); inline;
  procedure AddListItemAsHead(const AItemData: GItemType); inline;
  procedure AddItemAfterId(const AID: Cardinal; const AItemData: GItemType); inline;
  procedure AddItemAfterData(const ABaseItemData: GItemType; const AItemData: GItemType); inline;
  procedure AddItemAfter(const ApItem: pTListItem; const AItemData: GItemType); inline;
 
  procedure GetListItemById(AID: Cardinal; out ApItem: pTListItem); inline;
  procedure GetListItemDataById(AID: Cardinal; out AItemData: GItemType); inline;
  procedure GetListItemIdByData(const AItemData: GItemType; out AID: Cardinal); inline;
  procedure GetListItemByData(const AItemData: GItemType; out ApItem: pTListItem); inline;
  procedure GetListItemId(const ApItem: pTListItem; out AID: Cardinal); inline;
 
  procedure DeleteListItem(const ApItem: pTListItem); inline;
  procedure DeleteListItemHead; inline;
  procedure DeleteListItemById(const AID: Cardinal); inline;
  procedure DeleteListItemByData(const AItemData: GItemType); inline;
 
  procedure ClearError; inline;
  procedure Clear; inline;
  constructor Create;
  destructor Destroy; override;
 end;               
Аватара пользователя
*vmr
постоялец
Сообщения: 168
Зарегистрирован: 08.01.2007 00:46:07
Откуда: Киев
Контактная информация:

Сообщение *vmr »

GrayEddy писал(а):Зря все это приколотили. Это означает излишнее усложнение компилятора, который ничем не будет отличаться в скором от С++.

Не, скорость нисколько не убавится. Си++ тормознутый не из-за шаблонов, а из-за тупого разбиения на хидеры/код (*.срр).
GrayEddy писал(а):За все надо надо платить. Как правило, компиляторы Паскаля однопроходные. Оптимизация кода отстутствует (в VP и старом добром TP), в Delphi и FP с этим получше.

Опять наслушались "умных дядь"-сипипишников. Да однопроходные, но второй проход им и не нужен (в сипипи без него ну никак).
Кстати посмотрел исходники SVN-версии(2.1.1), там идет пост-оптимизация ассемблерного кода. Чем не второй проход?

Добавил: не обратил внимания что уже 3 страницы написали :))
Ответить