-
> По другому мысли, при передаче по значению, на стек копируется > вся "переменная", для динамического массива ее размер равен > 4 байтам, и статический и динамический массива и другие > переменные передаются в этом случае одинаково. Но размер > статического много больше N*SizeOf(Element).
> статический и динамический массива и другие > > переменные передаются в этом случае одинаково. Но размер > > > статического много больше N*SizeOf(Element).
А пример можно посмотреть для статического? А то чето до меня не доходит :)
-
Лучше всего function Summ(const a:array of Integer):Integer; Tricky_ (24.09.08 21:57) [16]Точнее, вызывающая функция передает ссылку и длину, а вызванная создает в стэке копию.
-
> GrayFace © (25.09.08 04:39) [21] > > Лучше всего function Summ(const a:array of Integer):Integer; > > > Tricky_ (24.09.08 21:57) [16] > Точнее, вызывающая функция передает ссылку и длину, а вызванная > создает в стэке копию.
Динамические массивы всегда передаются по ссылке.
-
Городской Шаман (25.09.08 06:13) [22]
procedure TForm3.Button2Click(Sender: TObject);
function GetFirst(A: array of Byte): Byte;
begin
Result := A[0];
end;
var
A: array of Byte;
begin
SetLength(A, 10000000);
Caption := IntToStr(GetFirst(A));
end;
-
до кучи насчет копии:
procedure ChangeFirst(A: array of Byte);
begin
A[0] := 100;
end;
var
A: array of Byte;
begin
SetLength(A, 10);
ChangeFirst(A);
Caption := IntToStr(A[0]);
end;
-
еще до кучи: если в заголовке процедуре объявлять параметр не открытым массивом, а использовать предварительно объявленный тип динамического массива, то копирования не будет. type TBA = array of Byte;
function GetFirst(A: TBA): Byte;
-
Открытые массивы вроде в П7 появились.
-
> MBo © (25.09.08 08:00) [25]
А если этот тип будет не динамическим массивом, а обычным?
-
> Городской Шаман (25.09.2008 6:13:22) [22]
Нифига, они передаются как по ссылке, так и по значению, просто динамический массив сам является ссылкой, как строка или класс. Вот вызовы
func x(ar: tStatArray); func x(var ar: tStatArray); func x(const ar: tStatArray);
func x(ar: tDynArray); func x(var ar: tDynArray); func x(const ar: tDynArray);
func y(s: string); func y(var s: string); func y(const s: string);
-
> А если этот тип будет не динамическим массивом, а обычным?
Уже несколько раз написано. Передача по значению не отличается, на стек посылается SizeOf(var) Для динамического это 4 байта, для статического N*SizeOf(Element) И [25] доказывает, что на стек помещается не 10 мб, стек размером меньше, а только 4 байта.
-
Я немного ошибся. Когда параметр - открытый массив, передается ссылка(на первый элемент) и high(var), а не длина. Когда параметр - динамический массив ( TBA = array of Byte; ), передается только ссылка на первый элемент. Т.е. обычная передача по ссылке, как у объектов. SizeOf(var) не передается никогда. (Delphi 2006) На всякий случай тоже приведу код, который смотрел в отладчике: type TIArr = array of integer;
function aaa(a: array of integer):integer;
begin
Result:= a[0];
end;
function bbb(a: TIArr):integer;
begin
Result:=a[0];
end;
procedure TForm1.Button1Click(Sender: TObject);
var
a1: TIArr;
a2: array[0..599] of integer;
begin
SetLength(a1, 600);
aaa(a1);
aaa(a2);
bbb(a1);
end;
|