这个就像write函数一样.可以称为操作符.
因为它是受编译器本身支持的.
例如我们写如下代码:
var
s : array of
array of
array of
array of char;
begin
SetLength(s,
1,
1,
1,
1);
end;
生成的汇编代码如下:
Unit1.pas.31: begin
00455294 55 push ebp
00455295 8BEC mov ebp,esp
00455297 6A00 push $00
00455299 33C0 xor eax,eax
0045529B 55 push ebp
0045529C 68E1524500 push $004552e1
004552A1 64FF30 push dword ptr fs:[eax]
004552A4 648920 mov fs:[eax],esp
Unit1.pas.32: SetLength(s,
004552A7 6A01 push $01 //压入参数,立即数1
004552A9 6A01 push $01 //压入参数,立即数1
004552AB 6A01 push $01 //压入参数,立即数1
004552AD 6A01 push $01 //压入参数,立即数1
004552AF 8D45FC lea eax,[ebp-$04] //把动态数组地址装入eax
004552B2 B904000000 mov ecx,$00000004 //把参数ecx装入数组要分配的维数,就是告诉有4个数组维数参数.(4个1)
004552B7 8B1574524500 mov edx,[$00455274]//装入数组的类型信息.没有类型信息是没法分配的.连数组元素是什么类型都不知道还能分配?
004552BD E8C205FBFF call @DynArraySetLength //调用RTL函数DynArraySetLength
004552C2 83C410 add esp,$10
实际上我们查看Systems单元的函数_DynArraySetLength.发现一串注释.
{ PROCEDURE _DynArraySetLength(var a: dynarray
typeInfo: PDynArrayTypeInfo
dimCnt: Longint
lengthVec: ^Longint) }
说明和我们上面分析的一样._DynArraySetLength的参数为传动态数组引用,船动态数组类型信息,传要分配的维数,传维数数组(栈里面的维数指针,维数数据是挨着的,可以看成是数组).
参数和Setlength根本不一样.这个是编译器支持的.编译器编译到SetLength的时候会根据他的参数自动构造出添加参数的代码.然后调用_DynArraySetLength.
我们自己的代码想做到这个效果门都别想.除非CodeGear的编译器工程师是你小弟,哈哈