Delphi编译器是如何处理const参数的?(50分)

  • 主题发起人 主题发起人 chcw
  • 开始时间 开始时间
C

chcw

Unregistered / Unconfirmed
GUEST, unregistred user!
传的是值还是引用?
 
不知道,书上说const参数会快一点;
 
不会吧?var 一般来讲要快一些。var 传递指针,所以你用这个指针寻址就可以修改变量。
const 传递变量的拷贝,指针只有 4 个字节,但是一般的变量都至少 4 个字节,考虑到
堆栈的速度,var 要快一些。
 
仔细读读帮助中的这段话:

Using const allows the compiler to optimize code for structured- and string-type parameters.
It also provides a safeguard against unintentionally passing a parameter by reference to
another routine.

const参数当然是传值的。
const有利于编译器优化代码,所谓的“快”是从此角度讲的。
 
做个测试就知道谁快了。

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
lStart,lEnd:integer;
tempStr :string;
begin
Label2.Caption:='';
lStart:=GetTickCount;
for i:=0 to 1000 do
begin
tempStr:=inttostr(i);
TestConst(tempStr);
// TestVar(tempStr);
end;
lEnd:=GetTickCount;
Label1.Caption:=FloatToStr((lEnd-lStart)/1000.0)
end;

procedure TForm1.TestConst(const str: string);
begin
Label2.Caption:=Label2.Caption+str;
end;

procedure TForm1.TestVar(var str: string);
begin
Label2.Caption:=Label2.Caption+str;
end;
 
1,对于基本类型,pascal值参和变参没有区别
2,delphi的const甚至可以这样写:
const a: integer = 1;
……
a := a + 1;
你说它是传递值还是引用?
 
to chcw, 你问的是在变量声明中的 const 还是函数声明中的 const?

to tinytao, 我说的是调用效率,不是伪对象 string 的特殊处理效率。就调用而言,
你写的程序两部分是一样快的。至于内部调用的 lstrcpy 究竟是怎么处理的,这不是
我要说明的问题。
 
const 对于传递 string,动态数组和接口等使用引用计数自动管理生存期的类型的变量比
使用 var 要快,因为生成的代码中不会附加对引用计数的增加减少等操作.对于一般 Size
<= 4 bytes 的参数,如整数,对象变量,用 const 容易利用 register 优化生成更紧凑的
代码.对于 Size > 4 bytes 的参数,const 方式实际也是通过引用来传递参数的.因此,一般
const 快一点.
 
这和C/C++中的参数传递规则是一样的,
根据你所传递参数的情况而定。

引用一段 C 代码更容量说明问题:

如建立一个函数 void __fastcall MyFunc(const String&amp
S);
此时传递的是 S 的引用。
S 的值不可以显式改变: S = "ChangedText";

但如果通过以下方式建立:
void __fastcall MyFunc(const String&amp
S
String&amp
V);
调用时,设置
String str = "ABC";
MyFunc(str, str);
此时如果改变MyFunc中的 V, 则 S 也同样被改变!

如果改成:
void __fastcall MyFunc(const String S
String&amp
V);
同样的调用,S 却是固定的。

Delphi 的调用规则与此相似。

所以,const 对参数的约束并不是固定不变的,要根据参数
的传入设置(引用/拷贝)具体而定。
 
后退
顶部