有两个函数:
fucntion selqry( qry: TQuery; strSQL: string): integer;//执行sql语句,返回数据集的条数
fucntion selqry( var qry: TQuery; strSQL: string): integer;//执行sql语句,返回数据集的条数
这两个函数功能一致,唯一的不同是,第一个参数,分别是传值和传引用。今天偶然翻翻《参透 delphi/kylix》,关于参数传值和传引用部分,好像是说,传引用不会给参数分配额外的空间,使用的是引用的内存空间;而传值会给参数在函数内分配一块内存空间,将值赋给参数。
我在cpu窗口下看了看两个函数的汇编代码,基本一致,就是传值 mov .. ebx,传引用 mov ..[ebx],
没有什么不同。
另外delphi 中的对象都是对象指针,根据这一点,我觉得上面两个函数应该是一样的。
我想问问高手的是,传值的函数会比传引用的函数多占用内存空间吗?那个更好一些?
谢谢!
fucntion selqry( qry: TQuery; strSQL: string): integer;//执行sql语句,返回数据集的条数
fucntion selqry( var qry: TQuery; strSQL: string): integer;//执行sql语句,返回数据集的条数
这两个函数功能一致,唯一的不同是,第一个参数,分别是传值和传引用。今天偶然翻翻《参透 delphi/kylix》,关于参数传值和传引用部分,好像是说,传引用不会给参数分配额外的空间,使用的是引用的内存空间;而传值会给参数在函数内分配一块内存空间,将值赋给参数。
我在cpu窗口下看了看两个函数的汇编代码,基本一致,就是传值 mov .. ebx,传引用 mov ..[ebx],
没有什么不同。
另外delphi 中的对象都是对象指针,根据这一点,我觉得上面两个函数应该是一样的。
我想问问高手的是,传值的函数会比传引用的函数多占用内存空间吗?那个更好一些?
谢谢!
int b;
{
b = 1;
}现在的声明方式void a(int b)
{
b = 1;
}这就是上面所说的多出来的空间,声明一个局部参数自然就有分配的空间唉,你看完就是了,在乎这么多??????
对比比较大的对象<包括自定义类型> 一般是传引用 因为较大的对象拷贝时就需要更多的空间,时间, 如果要修改的话 就用var aaa:TAAA;如果不修改 就用const aaa:TAAA,
如果是自定义类型的话 可以定义指针类型 传指针也是一个不错的选择。
---------------------
这还叫没区别?一个是ebx,一个是[ebx]
就像
P: ^Record;
那么
P := @aRecord;
和
new(p);
P^ := aRecord'
怎么会一样呢?
在Delphi里一般是不需要考虑传递参数这样的损耗的,因为大量使用了对象引用。Delphi规范中只是建议字符串最好加上Const来改进性能,不过我也从来没真正实行过。完全没有必要为了空间考虑来讨论这两者的不同,重要的还是语义上的差别。
fucntion selqry( var qry: TQuery; strSQL: string): integer;//执行sql语句,返回数据集的条数
第一,楼主的这两句语句是一样的.
大一看是有些不同.但是把一个对象作为参数,其实就是传的是一个指针.所以使用var 和不使用 var 是一样的.
fucntion selqry( qry: TQuery; const strSQL: string): integer;//执行sql语句,返回数据集的条数这想这样会好一些.这是从DELPHI算法数据结构上看到的.请参考.说的不一定对.
两个是不同的
你试试在函数里创建这个Query,再在外面使用就知道了。