我知道标记字符串参数const可以产生巨大的性能差异,但序数类型呢?通过制作它我能获得什么const吗?
我一直使用const处理字符串参数时,却从不为Integer,Pointer,类实例等.
使用时const我经常需要创建额外的临时变量,这些变量会替换现在写保护的参数,所以我想知道:我是否从标记序数参数中获得了什么const?
Mas*_*ler 46
你需要了解原因,避免"货物编程".将字符串标记为const会产生性能差异,因为您不再需要在字符串上使用互锁增量和减少refcount,这种操作实际上会随着时间的推移而变得更加昂贵,而不是更少,因为更多内核意味着更多的工作要做的是保持原子操作同步.这是安全的,因为编译器强制执行"此变量不会被更改"约束.
对于通常为4个字节或更少的序数,没有性能增益.使用const作为优化仅在使用大于4个字节的值类型(如数组或记录)或引用计数类型(如字符串和接口)时才有效.
但是,还有另一个重要优势:代码可读性.如果你传递一些东西作为const并且它对编译器没有任何影响,它仍然可以对你产生影响,因为你可以阅读代码并看到它的意图是不要修改它.如果您之前没有看过代码(其他人写过代码),或者如果您在很长一段时间后再回到代码并且在最初编写代码时并不记得您的想法,那么这可能很重要.
Cra*_*ntz 18
您不能意外地将它们视为var参数,并编译代码.所以它使你的意图清晰.
声明序数类型const没有区别,因为它们无论如何都是复制的(按值调用),因此对变量的任何更改都不会影响原始变量.
procedure Foo (Val : Integer)
begin
Val := 2;
end;
...
SomeVar := 3;
Foo (SomeVar);
Assert (SomeVar = 3);
Run Code Online (Sandbox Code Playgroud)
恕我直言声明序数类型const没有任何意义,正如你所说,要求你经常引入局部变量.