powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / with и без with
25 сообщений из 68, страница 1 из 3
with и без with
    #39911503
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
type
  TRecord = record
    A: Integer;
    B: Integer;
    C: Double;
  end;

  TRecordArray = array of TRecord;

procedure TForm9.FormCreate(Sender: TObject);
var
  RA: TRecordArray;
begin
  SetLength(RA, 10);
  with RA[1] do
  begin
    A := 3;
    B := 2;
    C := 1;
  end;
  RA[1].A := 3;
  RA[1].B := 2;
  RA[1].C := 1;
end;



Я думал, компилятор выделенное давно умеет оптимизировать...
...
Рейтинг: 0 / 0
with и без with
    #39911520
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в том числе поэтому я за with.
...
Рейтинг: 0 / 0
with и без with
    #39911530
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

Решается дополнительной локальной переменной (указатель на TRecord), их компилятор умеет раскладывать по регистрам если ему не мешать. with, в текущем её виде, очень опасная конструкция.
...
Рейтинг: 0 / 0
with и без with
    #39911599
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

А оптимизацию в debug-сборке включили?..
...
Рейтинг: 0 / 0
with и без with
    #39911612
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Я проверял релизную сборку и сморел внешним дизассемблером. Оптимизации это не про дельфю.
...
Рейтинг: 0 / 0
with и без with
    #39911684
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Квейд,

А оптимизацию в debug-сборке включили?..
разумеется
...
Рейтинг: 0 / 0
with и без with
    #39911689
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел FPC, он в обоих вариантах обновляет значение EAX. Дополнительная переменная ему тоже помогает.
...
Рейтинг: 0 / 0
with и без with
    #39911701
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел ещё Oxygene... Он вообще выкинул лишние операции, оставив только однократное присваивание. А чтобы он и его не выкинул пришлось в конце метода добавить вывод в консоль. Вот что LLVM животворящий умело приготовленный делает. Эх... :(
...
Рейтинг: 0 / 0
with и без with
    #39911712
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это только с динамическим массивом, а вот с таким
PRecordArray = ^TRecordArray;
TRecordArray = array[0..9] of TRecord;
нормально оптимизирует. И вроде бы с дин. массивом переданным как const.
...
Рейтинг: 0 / 0
with и без with
    #39911728
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey
Вот что LLVM животворящий умело приготовленный делает. Эх... :(
Можно и к fpc прикрутить LLVM, но не под Виндой.
https://wiki.freepascal.org/LLVM#Build_FPC_with_LLVM_support
...
Рейтинг: 0 / 0
with и без with
    #39911736
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

Да, я вкурсе (+18% к производительности, неплохо так).
...
Рейтинг: 0 / 0
with и без with
    #39911746
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
18% они получили на самом компиляторе - в целом не очень впечатляет, но это видимо из-за того, что там алгоритмы не векторизуемые и/или никто специально не затачивал под векторизацию.
Если заточить, тогда должно быть больше. Видимо, это они имеют в виду под "Artificial benchmarks will also be much faster".
...
Рейтинг: 0 / 0
with и без with
    #39911749
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

В том то и дело, что на обычном коде c обычным набором команд, а не на заточеном бенче. Это круто. На вычислительных задачах должно быть значительно больше, это да. Впрочем, у них и своя векторизация есть т.ч. отрыв может и не быть значительным (правда, я не смог собрать бенчик с использованием AVX, компилятор постоянно падал. Хотя, давно это было).
...
Рейтинг: 0 / 0
with и без with
    #39915725
KtoI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очевидно что
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
  RA: TRecordArray;
  v : TRecord;
begin
  SetLength(RA, 10);
    
  v := RA[1];
  v.A := 3;
  v.B := 2;
  v.C := 1;
end.



либо
Код: pascal
1.
 with RA[1] do



Всё остальное говнокод. А ну да, в новых версиях тип auto var
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
[SRC delphi]var
  RA: TRecordArray;
begin
  SetLength(RA, 10);
    
  var v := RA[1];
  v.A := 3;
  v.B := 2;
  v.C := 1;
end.

[/SRC]
...
Рейтинг: 0 / 0
with и без with
    #39915740
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И что будет в RA после таких присвоений?
...
Рейтинг: 0 / 0
with и без with
    #39915766
KtoI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DmSer,

Код: pascal
1.
 var v := RA[1];



будет ровно

Код: pascal
1.
2.
3.
4.
var
  v : TRecord;
begin
  v := RA[1];



100% одинаковый код листинг
...
Рейтинг: 0 / 0
with и без with
    #39915780
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KtoI
DmSer,

Код: pascal
1.
 var v := RA[1];



будет ровно

Код: pascal
1.
2.
3.
4.
var
  v : TRecord;
begin
  v := RA[1];



100% одинаковый код листинг


Учитывайте, что только в случае использования with будет изменён элемент массива RA.
...
Рейтинг: 0 / 0
with и без with
    #39915800
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пофантазирую...

Оператору with в Паскале не хватает возможности определения алиасов. Было бы здорово иметь такой синтаксис:
with myArray[i] as a, myObject as o do
begin
a := 1;
o.Value := a;
end;
Это позволило бы сделать оператор with более безопасным, а синтаксис языка более приятным.
...
Рейтинг: 0 / 0
with и без with
    #39915806
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
И что будет в RA после таких присвоений?
Указатели наше все :)
...
Рейтинг: 0 / 0
with и без with
    #39915809
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
with myArray[i] as a, myObject as o do
Так нельзя. AS это приведение типа
...
Рейтинг: 0 / 0
with и без with
    #39915821
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
DmSer
with myArray[i] as a, myObject as o do
Так нельзя. AS это приведение типа


Вместо as можно предложить и другой набор букв, это не самое главное. Да и с as можно разрулить, было бы желание.
...
Рейтинг: 0 / 0
with и без with
    #39915834
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
with myArray[i] as a, myObject as o do

В Oxygene это выглядит так:
Код: pascal
1.
2.
with a := myArray[i], o := myObject do
...
...
Рейтинг: 0 / 0
with и без with
    #39915911
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Пофантазирую...

Оператору with в Паскале не хватает возможности определения алиасов. Было бы здорово иметь такой синтаксис:
with myArray[i] as a, myObject as o do
begin
a := 1;
o.Value := a;
end;
Это позволило бы сделать оператор with более безопасным, а синтаксис языка более приятным.


Для этого with не нужен, решается через обычные переменные:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var 
  a: PInteger;
  o: TMyObject absolute MyObject;
...
  a := @myArray[i]
...
  a^ := 1;
  o.Value := 1;
...
...
Рейтинг: 0 / 0
with и без with
    #39915918
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
DmSer
Пофантазирую...

Оператору with в Паскале не хватает возможности определения алиасов. Было бы здорово иметь такой синтаксис:
with myArray[i] as a, myObject as o do
begin
a := 1;
o.Value := a;
end;
Это позволило бы сделать оператор with более безопасным, а синтаксис языка более приятным.


Для этого with не нужен, решается через обычные переменные:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var 
  a: PInteger;
  o: TMyObject absolute MyObject;
...
  a := @myArray[i]
...
  a^ := 1;
  o.Value := 1;
...



Согласен, способов написать отвратный код в Delphi предостаточно (как и везде). Я-то другое предлагаю: способ, позволяющий в некоторый случаях писать более приятный код.
...
Рейтинг: 0 / 0
with и без with
    #39915929
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO, оператор width лучше реализован в VisualBasic : свойства, которые относятся к переменной из with предваряются точкой, сам символ, конечно, не важен, можно заменить на "~", например. Тогда можно писать:
Код: sql
1.
2.
3.
4.
5.
with Bmp1,Bmp2 do
begin
 ~Width:=~~Width;
 ~Height:=~~Height;
end;


Конструкция, когда есть вложенные операторы width (неважно в краткой или полной записи), достаточно редки, т.к. приводят к совсем трудно понимаемому коду, но когда используются свойства в методах, это было бы удобно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm.SomeProc(ABmp:TBitmap);
begin
  with ABmp do
  begin
    ~Width:=Width;
    ~Height:=Height;
  end;
end;


В такой конструкции происходит присвоение битмапу размеров формы.

Возможно, смысл такой записи можно интерпретировать и наоборот :)
...
Рейтинг: 0 / 0
25 сообщений из 68, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / with и без with
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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