在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
{*********************************************}
Ok, 我想谈谈Object Pascal中关于const的一些事,起因是我发现一方面Object Pascal中关于const的说明很少,另一方面在现实中存在对其的许多误用。当然,我这是杂谈,不可能面面俱到。
1、const是什么?
2、我们需要const么? 当然,const还有其它一些好处,但这两点无疑是引入const的根本原因。语言的优劣既要易于表达(语义上)还要尽量减少错误(语法上),毫无疑问,const满足这一要求。
3、const的用途
4、变量的内存布局 一个变量对应一个内存块,这个内存块可能存在于代码区、数据区、也可能存在于堆区和栈区。通常,我们不关心这个,但是变量存在不同的区域对变量的使用是有影响的,它会影响变量的生命周期。通常,存在于代码区和数据区的生命期最长,一般说堆区的变量长于栈区。通常,在Object Pascal中我们像下面这样使用变量:
5、一个被const修饰的变量为什么需要被改变 补充: 任何变量都是一个内存块,从某种程度上说,const修饰实际上是修饰这个内存块,这种修饰强调两点:1,内存块位置和大小不可以改变;2,内存块内容不可以改变。当仅仅强调1时就是“静态变量”的情况,当二者同时强调时,就是上面I所对应的情况。所以,就我个人而言,我更倾向于Pascal所使用const语义而不是C中使用“静态变量”语义,后者似乎缺少某种一致性,增加了概念。
Label1.Caption := 'val1: ' + IntToStr(val1);
7、利用const修饰构建只能生成唯一对象的类 implementation constructor TSingle.Create; constructor TSingle.CreateInstance; destructor TSingle.Destroy; class function TSingle.GetInstance(Request: integer): TSingle; class procedure TSingle.ReleaseInstance; Class function TSingle.SingleInstance: TSingle;
8、题外话
补充: 1,const修饰可能会优化编译代码。关于这一点与编译器密切相关,由于变量被const修饰后其内存大小和位置是确定的,这样,在如下的方式里可以被优化 procedure Foo(const val: integer);
虽然从语法上这是一个值传递,按惯例需要复制参数传递到函数Foo中,但因为const的特性,这里只需要参数传递地址就可以了,这会比不使用const修饰快,尤其是在使用string作为参数的过程中,效率优势会明显。当然,这一点不是Object Pascal要求的,与编译器有关。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论