Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Процедура Default(); / 22 сообщений из 22, страница 1 из 1
03.12.2019, 16:49
    #39897668
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
Нашёл тут в одном стороннем исходнике коде такую конструкцию:

Код: pascal
1.
 ProcessInfo := Default(TProcessInformation);


Вопрос: кто-нибудь знает где можно почитать про сабж?

CTRL-Click по ней отправляет в начало System, т.е. это макрос.
В справке я её не нашёл.
Гугл отправляет читать про default свойства объектов.
Копаться в ассемблерном коде очень не очень.

Что она делает вроде понятно, но хотелось бы посмотреть на документацию...
...
Рейтинг: 0 / 0
03.12.2019, 17:15
    #39897700
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
Возвращает значение по умолчанию для типа.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    function Test<T>(): T;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.Test<T>: T;
begin
  Result := Default(T);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  var a := Test<Int32>();
  var b := Test<string>();
  var c := Test<TRect>();
end;
...
Рейтинг: 0 / 0
03.12.2019, 17:20
    #39897703
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
X-Cite
Возвращает значение по умолчанию для типа.
alekcvpЧто она делает вроде понятно, но хотелось бы посмотреть на документацию...
Какое значение считается значением по-умолчанию для TValue? Для Variant? Для string и PChar? И т.п.
0 / nil / NULL / '' для всех?
Всегда ли её можно использовать вместо FillChar(SomeRec, SizeOf(SomeRec), 0) ?
Есть ли какие-нибудь подводные камни или особенности её использования?
Почему её почти никто не использует, ведь это явно удобнее и читабельнее, чем FillRect?
И т.п. и т.д.
...
Рейтинг: 0 / 0
03.12.2019, 17:27
    #39897714
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
alekcvp
0 / nil / NULL / '' для всех?
Да.
alekcvp
Всегда ли её можно использовать вместо FillChar(SomeRec, SizeOf(SomeRec), 0) ?
Да. Особенно в таких случаях
Код: pascal
1.
2.
3.
4.
5.
type
  TMyRec = record
    Str: string;
    Intf: IInterface;
  end;

С FillChar по такой записи будет утечка
alekcvp
Почему её почти никто не использует,
FillChar быстрее, Default безопаснее
...
Рейтинг: 0 / 0
03.12.2019, 17:30
    #39897716
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
Я всегда использую, когда нужно значение по умолчанию...

TValue - это record, значит поведение по умолчанию как для любых записей.

Я думаю может это вам поможет?
https://stackoverflow.com/questions/14176198/difference-between-initialize-default-and-fillchar
...
Рейтинг: 0 / 0
03.12.2019, 17:34
    #39897719
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
X-Cite
Я всегда использую, когда нужно значение по умолчанию...

TValue - это record, значит поведение по умолчанию как для любых записей.

Я думаю может это вам поможет?
https://stackoverflow.com/questions/14176198/difference-between-initialize-default-and-fillchar


Спасибо за ссылку.
Странно что в официальной справке её нет (или фиг найдёшь).
...
Рейтинг: 0 / 0
03.12.2019, 17:42
    #39897725
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
alekcvp
Странно что в официальной справке её нет (или фиг найдёшь).

Официальная справка вообще годится только в помойку. Ещё несколько лет назад я, когда ставил дельфу, подключал к ней хелп от D6, в нём было куда больше полезной информации. Сейчас уже ленюсь и вообще не пользуюсь :)
...
Рейтинг: 0 / 0
04.12.2019, 11:53
    #39898014
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
Если поэкспериментировать и посмотреть итоговый асм, Default во многих случаях быстрее FillChar за счет того, что на небольших типах вставляются непосредственно инструкции mov вместо вызова функции. Я эту штуку обожаю и почти везде у себя применяю. Она еще и намного безопаснее за счет контроля типа.
Почему она мало распространена? Привычка олдфагов, отсутствие справки. По мне, одна из топ-5 самых полезных удобняшек в Дельфях после 7ки.
...
Рейтинг: 0 / 0
04.12.2019, 13:05
    #39898056
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
Василий 2
По мне, одна из топ-5 самых полезных удобняшек в Дельфях после 7ки.

Огласите весь список, пожалуйста (С)
...
Рейтинг: 0 / 0
04.12.2019, 13:30
    #39898072
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
alekcvp
Василий 2
По мне, одна из топ-5 самых полезных удобняшек в Дельфях после 7ки.

Огласите весь список, пожалуйста (С)

Что ж, я знал, что этот вопрос последует...))
Без сортировки по значимости
- Exit(value)
- Default
- inline
- методы и прочие class-фичи у записей
- for in
...
Рейтинг: 0 / 0
04.12.2019, 13:37
    #39898077
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
Тогда надо было сразу говорить,
что "удобняшек в языке Дельфи".
И где генерики, анонимные методы
и пр. радости жизни ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.12.2019, 14:06
    #39898091
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
Гаджимурадов Рустам
Тогда надо было сразу говорить,
что "удобняшек в языке Дельфи".
И где генерики, анонимные методы
и пр. радости жизни ?

Еще Юникод вспомни)
Это не удобняшки, а серьезные фичи.

Вот кстати еще одна неочевидная ситуация, когда Default помогает избежать бага

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function Foo: TSomeRec;
begin
  // ! Delphi оставляет значение Result от предыдущего вызова. FillChar после этого
  // затирает ссылки на строки, и происходит утечка памяти. Поэтому обнуляем результат
  // через присвоение нулевой записи.
  Result := Default(TSomeRec);
  ...
  Result.str := '...';
end;
...
Рейтинг: 0 / 0
04.12.2019, 14:22
    #39898102
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
Василий 2

Без сортировки по значимости
- Exit(value)
- Default
- inline
- методы и прочие class-фичи у записей
- for in
А, ну остальное я знаю :)

Василий 2

Вот кстати еще одна неочевидная ситуация, когда Default помогает избежать бага
Код: pascal
1.
2.
function Foo: TSomeRec;
....


Потому что, по-факту, компилятор этот вызов преобразует в
Код: pascal
1.
2.
procedure Foo(var Result: TSomeRec); // только Result будет не в EAX, а на стеке ЕМНИП
....


Такая же хрень со строками и прочими ссылочными типами.
...
Рейтинг: 0 / 0
04.12.2019, 14:51
    #39898127
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
alekcvp
Такая же хрень со строками и прочими ссылочными типами.

Угу, но остальные типы не затираешь FillChar-ом, поэтому на утечку памяти и нет шанса наткнуться.
...
Рейтинг: 0 / 0
04.12.2019, 19:52
    #39898303
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
_Vasilisk_
alekcvp
0 / nil / NULL / '' для всех?
Да.
alekcvp
Всегда ли её можно использовать вместо FillChar(SomeRec, SizeOf(SomeRec), 0) ?
Да. Особенно в таких случаях
Код: pascal
1.
2.
3.
4.
5.
type
  TMyRec = record
    Str: string;
    Intf: IInterface;
  end;


С FillChar по такой записи будет утечка
alekcvp
Почему её почти никто не использует,
FillChar быстрее, Default безопаснее


А для чего использоватьFillChar для структуры, содержащей string и прочие указатели ?
Как-бы очевидно, что будет утечка
...
Рейтинг: 0 / 0
04.12.2019, 22:02
    #39898319
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
а в чем практический смысл этой процедуры? Разве при объявлении рекордов они не инициализируются? Даже в микроконтроллерах объявляемые переменные чистятся.
...
Рейтинг: 0 / 0
04.12.2019, 23:34
    #39898344
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
GrigoriyFomin,

локальные не чистятся.
...
Рейтинг: 0 / 0
04.12.2019, 23:34
    #39898345
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
GrigoriyFomin,

да и result, как выше писали, не всегда.
...
Рейтинг: 0 / 0
05.12.2019, 00:19
    #39898351
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
defecator
А для чего использоватьFillChar для структуры, содержащей string и прочие указатели ?
Как-бы очевидно, что будет утечка
+1
...
Рейтинг: 0 / 0
05.12.2019, 01:11
    #39898356
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
makhaon,

ну как бы не новость - языку не один десяток лет - радость-то в чем? Тут FMX до путя довести не могут много лет - реальный объем работы. И тут в топе - цикл for in, exit(), классовые функции........ И в чем академическая ценность?? Сэкономил 4 строчки кода? Да, еще забыл один из топов - инлайн функции - ну прям задышалось легче....
...
Рейтинг: 0 / 0
05.12.2019, 10:08
    #39898438
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
defecator
А для чего использоватьFillChar для структуры, содержащей string и прочие указатели ?
Как-бы очевидно, что будет утечка

Потому что для локальной переменной компилятор инициализирует строки пустым значением, а вот простые поля не инициализирует, поэтому при первом обращении к локальной переменной можно использовать FillChar();, кроме случая с Result.
...
Рейтинг: 0 / 0
05.12.2019, 10:29
    #39898446
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура Default();
defecator
А для чего использоватьFillChar для структуры, содержащей string и прочие указатели ?

Для зануления остальных полей

GrigoriyFomin
И тут в топе - цикл for in, exit(), классовые функции........ И в чем академическая ценность?? Сэкономил 4 строчки кода? Да, еще забыл один из топов - инлайн функции - ну прям задышалось легче....

Для тех, кто не умеет читать - прямым текстом: топ удобных мелочей , без которых можно обойтись, но которые делают процесс немного приятнее.
Ну а то, что ты не в состоянии оценить инлайн функции, это твои личные трудности.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Процедура Default(); / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]