VB的天地,横看成岭侧成峰

VB的天地,横看成岭侧成峰

前言

横看成岭侧成峰,远近高低各不同。不识庐山真面目,只缘身在此山中。这是苏轼那首著名的《题西林壁》,经历过汇编、C/C++,再来回看VB时,这首诗是再适合不过的了。之所以Windows能稳坐PC霸主的宝座,源自于微软早期对计算机的深刻理解。

在《以史为鉴,编程语言,启示录之系统觉醒 》中,给大家揭示了操作系统的觉醒,最根本的原因就在于人机交互。而鼠标驱动下的窗口界面,将人机交互的便捷性推向了至今都无法超越的高度。Windows宁愿放弃更优良的性能表现,也不放弃高效的人机交互,这是Linux快的原因,同时也是Linux无法超越Windows的原因。

在Windows上人机交互是第1位的,而性能是第2位的。这跟国企赚利润只是1方面的考量,是一个道理。如果不懂这个,就没法理解Windows,更没法理解VB。曾经有网友说,国产系统一天到晚不是桌面GUI的美化,就是QQ微信WPS的适配,咋不移植个VB过去?撇开Windows上VB近半个世纪的生态不说,其实单从技术实现上也很难。这是设计理念根底上的差异导致的,否则Linux上早就有人扛起VB的大旗向微软宣战了 。

早在《VB/VBA,请让我点名表扬你 》中,就向读者朋友介绍了VB的视窗和事件,将实用性发挥得淋漓尽致,足以胜任桌面应用的绝大数场景。VB的事件驱动,实质上就是系统的消息驱动,VB自始至终都围绕着便捷的人机交互。VB的语法如此,VB的IDE更是如此。至于VB面向对象与否,指针与否,多线程与否,横向比较没落与否等等,其实早已不重要。

作者选择在《VB的任性,从Variant开始 》中,将Variant作为VB技术框架分享的干货入口,正是基于VB和系统在底层设计上的理念。在《变量,还有这些秘密 》中,给读者朋友介绍了变量的本质,那本文继续从Variant留下的话题,开始深挖VB背后那些温暖的故事。

一、Variant掀开VB变量的隐身衣

在《VB的任性,从Variant开始 》中已提到,Variant的尾成员,有8字节长度。用于装载数据或指针,从而将VB变量的数据类型一分为二:数值类型和指针类型。

二、看穿数值类型,方显VB威力

什么是数值类型?Byte, Boolean,Integer,Long,Single,Double, Date,Currency就是啦,也即IsNumeric函数返回值为True的类型(你看VB其实是给了暗示的)。数值类型变量的封装,是跨语言的,使用性能上的差异几乎忽略不计。C/C++不要来劝我,Python/C#/JAVA等字节码语言更不要来劝我。

数值类型的共同特点是,分配的内存,及大小是固定的。当在代码块(通常是Sub/Function/Property)中声明这些变量时,VB的变量封装机制,首先就会在栈上申请固定尺寸的内存。比如Byte为1字节, Boolean 和Integer为2字节,Long和Single为4字节,Double, Date和Currency是8字节。

但是,栈是以4字节对齐的,所以VB中Byte、Boolean、Integer、Long和Single的资源耗费及性能,实际上是一样的。这也是为什么,鼓励大家多用Long类型来提升代码性能的原因。大家经常见到,VB使用API时,可以将Byte、Boolean、Integer类型的变量传递给Long类型的参数,也正是这个原因啦。

通过反汇编VB的代码块,就可以发现,在安装VB异常处理后,就轮到开辟变量内存。这也说明在VB的代码块中,何处声明变量,其实是不会影响代码性能的。全凭个人喜好和代码的可读性。

此后的变量名,其实就跟指针一样啦。参与运算、重新赋值,都不再涉及内存分配,但用完后可以自动释放内存,又比指针安全。所以,在VB的高阶应用中,没必要找数值类型的麻烦,尽量用Long就好。

VB的数值类型中Single,Double,Date和Currency是值得一说的,比如处理文件属性,解决VB的8字节大整数问题等,有喜欢的朋友,请继续关注BtOffier。

三、指针类型,一言难尽

我们说了,Variant类型只有16字节,但是Variant却可以接收字符串。字符串肯定不止16字节嘛,这就只有指针才能解释了。我们知道,进程栈很好,使用方便,速度高效,但好东西不容易贪到啊,毕竟是它很有限的。你把字符串这样的憨包塞进去,进程还不立马噎死掉!很显然,重型装备的机制,跟数值那样的轻武器,是不一样的。

那什么是指针类型?把VB非数值型变量传递给Variant类型,如果其尾成员的高4字节是0的,则为指针类型。这么说吧,如果把VB中数值类型等同于指针的话,那VB指针类型就是指针的指针。

具体来说,String、Object、自定义结构体和数组,便是VB中的指针类型啦。你说他们那个让人省心了。它们典型的特征,就是表里不一。变量声明时分配的是固定的4字节,但变量地址里的值却不是变量数据,而是数据指针,还是千变万化的。

既然4字节装不下数据,那就得另辟非栈内存空间。拿String类型来说,其变量每赋值一次,其封装机制就会重新释放、申请、分配栈外内存。如果你叠值,堆了罗汉,还会涉及内存的拷贝(这就是著名的变量深拷贝)。

所以说,体现一门语言是否高级,就要看指针型数据的封装处理,但无一例外都是各大语言的老大难。这就很容易理解,1962年时,VB的祖师爷DOPE,直接扔掉字符串类型的原因了。很多非职业IT,最后上了Python的车,我估计跟Python的字符串封装有很大的关系。

VB的指针类型,一言难尽,每一个都要分若干专题才能讲得清楚。不过,总算开了个头。欢迎大家继续关注BtOfficer,不仅站在多年老#CPA#,老投行以及常年IT#投资#的角度,更站在专业#IT#的角度,给广大非IT人员分享最简易的IT方案。总之,从行业、投资看IT,从IT看职业,带你涨知识。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值