关于Variant变体型变量占用内存测试
vb吧
全部回复
仅看楼主
level 13
佐腾君♂ 楼主
为了放大效果,我用一个很大的数组进行测试。
莫插楼!
2012年11月11日 16点11分 1
level 13
佐腾君♂ 楼主
下面是MSDN对Variant的描述
2012年11月11日 16点11分 2
沙发
2013年02月05日 13点02分
level 13
佐腾君♂ 楼主
测试代码如下:
Option Explicit
Private Sub Form_Load()
    Dim a() As Variant
    Dim i As Long
    Const UB As Long = 10000000
    ReDim a(UB)
    Stop
    For i = 0 To UB
        a(i) = 1
    Next
    Stop
    For i = 0 To UB
        a(i) = 9.99999
    Next
    Stop
    For i = 0 To UB
        a(i) = "str"
    Next
    Stop
    For i = 0 To UB
        a(i) = "this is long string"
    Next
    Stop
End Sub
2012年11月11日 16点11分 3
level 13
佐腾君♂ 楼主
初始化为数值1后,内存占用没有发生变化。
赋为浮点值后,也没有发生变化。
2012年11月11日 16点11分 6
level 13
佐腾君♂ 楼主
测试完毕,只是呼吁下新手们,不要因为变体型变量方便好用就滥用它,能不用就尽量不要用,养成良好的编程习惯。等你深入之后就会明白它确实是个垃圾类型,像非常强大的C/C++语言,她有着丰富的数据类型但就是没有变体,因为不需要。
2012年11月11日 17点11分 8
level 7
此贴一定要顶,感谢楼主说的那么详细,
2012年11月12日 00点11分 9
吧务
level 15
支持下
2012年11月12日 00点11分 10
level 7
对于未确定数据类型的变量,变体数据类型允许以可变方式存储数据。比如,若存储不带小数点的一个较小的数值,则变体类型变量对该数值使用整型来表示,以此类推, 这些话是书上说的,这样看来,变体型也不怎么耗用内存嘛?就是效率不行,和失去对数据类型的记录,并破坏用户应用程序,而且会使应用程序调试更加困难,
2012年11月12日 08点11分 11
只是表示而已,如果你保存数字1,打开变量监视窗口,它显示类型为Variant/Integer,如果保存1.1就显示Variant/Double,但无论保存什么都是占16Byte内存,比任何数值类型都大。如果像我这样使用变体的数组会占用非常大的内存,在实际编程中显然不合适。
2012年11月12日 09点11分
回复@黄佐腾 :嗯,这点书上没说,我到时候测试下,
2012年11月12日 09点11分
回复 a690392431 :书上没说会自动节省内存吧?要是说了。。果断的把书扔了。VB是M$出的编译器,一切以MSDN为准。
2012年11月12日 09点11分
回复@黄佐腾 :没说,只是说不要太经常用,但是他只说大数据就转大类型,没说小数据转换成小数据,也就是Integer或者Single,如果小数据转成大类型的话,我果断不用,
2012年11月12日 09点11分
level 13
佐腾君♂ 楼主
啊啊~居然精了[Yeah]
2012年11月12日 08点11分 12
level 7
同时发帖,[惊讶]
2012年11月12日 08点11分 13
level 11
顶一个,楼主精神值得赞赏
2012年11月12日 09点11分 14
[Love]
2012年11月12日 09点11分
level 7
我可以用VarType函数进行测试么?
2012年11月12日 09点11分 15
你要测试什么?
2012年11月12日 09点11分
VarType返回子类型的
2012年11月12日 09点11分
回复@黄佐腾 :不是返回当前Variant的数据类型么?
2012年11月12日 09点11分
是的
2012年11月12日 09点11分
level 13
佐腾君♂ 楼主
2012年11月12日 09点11分 16
level 7
@ 黄佐腾
2012年11月12日 11点11分 17
level 7
怎么我监视到全部都是Boolean型的? [拍砖]
2012年11月12日 12点11分 18
上代码
2012年11月12日 12点11分
不,是上图。
2012年11月12日 12点11分
level 7
娘亲Google浏览器上传不了图,
2012年11月12日 12点11分 19
2012年11月12日 12点11分
看来你还不会使用监视功能哦,你点开“本地窗口”这个不用自己填
2012年11月12日 12点11分
你监视的是“a = 1”而不是“a”的值,表示式“a = 1”的值就是布尔型的,一点没错。
2012年11月12日 12点11分
回复 Nukepayload2 :[揉脸]
2012年11月12日 12点11分
level 6
VB本就不适合开发大型程序。中小型程序使用vb开发好处是便捷、高效、快速。
应用到实际开发情况中,1KW大小的变体数组几乎见不到的……(如果真要牵扯到大数据处理,肯定选择高效的c了,做成dll供vb调用),所以不必太纠结这个数据类型占用内存的情况,如今电脑都标配4GB,害怕不够用?
当然,养成良好的变成习惯也很重要。
2012年11月12日 13点11分 20
恩,但是理解一门语言也是要这样的,[Kiss],而不是我在纠结,呵呵,反而纠结越多,知道的越多,。
2012年11月12日 14点11分
回复 a690392431 :学得越多,越纠结……
2012年11月12日 14点11分
回复 独孤之圣 :恩,呵呵,
2012年11月12日 14点11分
level 9
顶。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
2012年11月12日 14点11分 21
吧务
level 13
存取是压缩的:
Const s = "D:\Program Files\TestVBNumb\"
Dim a(), i&
Private Sub Form_Load()
ReDim a(2047)
Print "2048Null size " & Wr("2048Null")
ReDim a(1023)
Print "1024Null size " & Wr("1024Null")
For i = 0 To 1023
a(i) = CInt(i)
Next
Print "1024Int size " & Wr("1024Int")
For i = 0 To 1023
a(i) = i
Next
Print "1024Long size " & Wr("1024Long")
For i = 0 To 1023 Step 2
a(i) = CInt(i)
Next
Print "1024LongInt size " & Wr("1024LongInt")
End Sub
Function Wr(ByVal n$)
n = s & n & ".dat"
Open n For Binary As #1
Put #1, , a
Wr = Hex(LOF(1))
Close #1
End Function
2012年11月14日 10点11分 22
写文件会自动压缩,这我倒是没试过,不过太过自动的东西我不觉得是什么好东西。
2012年11月14日 17点11分
吧务
level 13
用varptr测试:
Dim a, aa, b()
Private Sub Form_Load()
ReDim b(1023)
a = b
Print VarPtr(a(0)) - VarPtr(a)
Print VarPtr(aa) - VarPtr(a)
Print VarPtr(a(1)) - VarPtr(a(0))
End Sub
2012年11月14日 10点11分 23
哦对,这样也能说明一个Variant占16Bytes
2012年11月14日 17点11分
1