请教一个const关键字问题,高手请来 函数参数用const 关键字,我查了一下delphi的帮助,说是可以使编译器更优化,但是我不清楚这个更优化是指内存占用更小?还是运行速度更快?还是两者兼有? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是两者都可能比如你写一个const的变量赋值给一个变量,那么就可以直接将const变量的值替换.过去,不占内存空间. 还是两者兼有,表示你不对String进行修改,编译时就不用在加TryExcept进行保护了你可以参考《Delphi高手突破》或者《Delphi源代码分析》,不过也有可能不是,具体那本书我记不清了 有没可能用了const 关键字,运行速度还更慢的情况?因为现在我只需要保证运行速度 const 关键字和速度慢没有直接的必然的关系,关键还是算法的速度 用const优化主要体现在传值上,比如1、procedure A (s:string);2、procedure A (var s:string);3、procedure A (const s:string);上面的3种情况属3传值最快,因为const 只是传4个字节的指针。const 对于传递 string,动态数组和接口等使用引用计数自动管理生存期的类型的变量比使用 var 要快,因为生成的代码中不会附加对引用计数的增加减少等操作.对于一般 Size <= 4 bytes 的参数,如整数,对象变量,用 const 容易利用 register 优化生成更紧凑的代码.对于 Size > 4 bytes 的参数,const 方式实际也是通过引用来传递参数的.因此,一般 const 快一点. 使用const传参,对于一些结构类似就不需要进行复制,测试一下下面的代码Type MyRec = packed record I: Integer; J: Integer; end;Function ConstFunc(const R:MyRec): String;begin //取参数地址 Result := format('%:.8x',[Integer(@R)]);end;Function NonConstFunc(R:MyRec): String;begin //取参数地址 Result := format('%:.8x',[Integer(@R)]);end;var R: MyRec; str_Addr_Of_Const: String; str_Addr_Of_NonConst: String;begin R.I := 10; R.j := 100; ShowMessage(Format( 'Address of Source = %s'#13#10 + 'Address of None-Constants Argument Passing = %s'#13#10 + 'Address of Constants Argument Passing = %s', [ format('%:.8x',[Integer(@R)]), NonConstFunc(R), ConstFunc(R)]));end; 视情况,const 可以直接编译成一个常数,不用访问内存 求2010下抓图的方法或者控件 何不修改注册表,使程序在电脑启动时能自动启动? StringReplace问题 关于Delphi访问EJB组件 关于用QUERY的两个时间段的 查询语句 在delphl中怎样查询数据库?急用,please help!SOS!!! ?????? 2个人是否可以开个资讯(软件)公司,是否胜任业务的要求? 用Application.OnException如何对异常进行分类? 请教如何实现 关于THashedStringList的问题。 整型数据能不能转换成字符型数据?
比如你写一个const的变量赋值给一个变量,那么就可以直接将const变量的值替换.过去,不占内存空间.
因为现在我只需要保证运行速度
1、procedure A (s:string);
2、procedure A (var s:string);
3、procedure A (const s:string);上面的3种情况属3传值最快,因为const 只是传4个字节的指针。const 对于传递 string,动态数组和接口等使用引用计数自动管理生存期的类型的变量比使用 var 要快,因为生成的代码中不会附加对引用计数的增加减少等操作.对于一般 Size <= 4 bytes 的参数,如整数,对象变量,用 const 容易利用 register 优化生成更紧凑的代码.对于 Size > 4 bytes 的参数,const 方式实际也是通过引用来传递参数的.因此,一般 const 快一点.
MyRec = packed record
I: Integer;
J: Integer;
end;
Function ConstFunc(const R:MyRec): String;
begin
//取参数地址
Result := format('%:.8x',[Integer(@R)]);
end;Function NonConstFunc(R:MyRec): String;
begin
//取参数地址
Result := format('%:.8x',[Integer(@R)]);
end;
var
R: MyRec;
str_Addr_Of_Const: String;
str_Addr_Of_NonConst: String;
begin
R.I := 10;
R.j := 100; ShowMessage(Format( 'Address of Source = %s'#13#10 +
'Address of None-Constants Argument Passing = %s'#13#10 +
'Address of Constants Argument Passing = %s',
[ format('%:.8x',[Integer(@R)]),
NonConstFunc(R),
ConstFunc(R)]));
end;