首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB中,传值(ByVal)和传地址(ByRef)的选择有关问题

2012-01-23 
VB中,传值(ByVal)和传地址(ByRef)的选择问题一般情况下,如果你传入的参数在执行完SUB或FUNCTION后还想回收

VB中,传值(ByVal)和传地址(ByRef)的选择问题
一般情况下,如果你传入的参数在执行完SUB或FUNCTION后还想回收,就用传址,如果不想要了,要用传值。需要注意的是传值在理论上要比传地址速度慢。

我在百度搜索中,发现有人这么讲,他的说法正确吗?
传值不是做了变量的副本吗?不是要分配内存,速度会快吗?


[解决办法]
ByRef:传递引用,也就是把变量的地址传给过程或函数,操作时直接对该变量操作。
ByVal:传值,创建一个变量的副本(存放在栈区),用完即销毁,不会影响到变量本身。
[解决办法]
无论传值还是传址,都要在栈中分配一个内存,传值,在该内存中保存变量值,传址,在该内存中保存变量的地址。

速度根据数据类型不同而不同,传址都是4B(字节),传值
整形:传值2B 
Long:4B 
single:4B 
double:8B 
Date:8B
.......
结构体(Type定义类型)、对象只能传址




[解决办法]
传递引用不需要在栈区分配内存的,它取决于你的变量所在区域,如果是全局变量,那么它肯定就不会是在栈区。
[解决办法]
一般不会因为速度问题来考虑传值还是传址,都是根据情况用
[解决办法]
按需求编写代码。

需要改变传入的参数,并返回这个参数,那就传递引用。

不改变传入的参数,那就传值。


[解决办法]
不是速度问题,而是需求问题,如数组必须传地址。

[解决办法]

探讨
传递引用不需要在栈区分配内存的,它取决于你的变量所在区域,如果是全局变量,那么它肯定就不会是在栈区。

[解决办法]
这个问题不应该在这里考虑,这是VB6编译器应该考虑的问题.

作为VB6的编码者,精力放在代码的逻辑本身就可以了,效率问题方面在没有出现时就没必要去管.

不然的话VB6这种高度封装就没有意义了,那你还不如使用WIN32宏汇编写程序,语法反正与BASIC语法差不多.
[解决办法]
1、除了 Long 类型,其他一概全部为传址或地址类型,只有long才具有真正意义上的传值
2、传址,传值的速度不可比较,没有谁好谁不好一说
3、都需要在栈上分配内容,做为被调用函数的参数存储区,fastcall的低于4个参数时除外
4。。。 如果不是调用api,这个问题基本可以忽略

热点排行