贸易值和贸易量的区别(FOB和EXW

我们外面不一样,里面一样

前言

笔者在010-3010中以知识点的形式,堆栈4字节对齐,所以1字节的Byte、2字节的Boolean和Integer,其实和4字节的Long一样,尽量使用4字节的Long进行代码的然后有朋友的私信我表示不服。 其实前面的结论没有问题,但是没有说清楚。 具体是怎么回事? 下面,详细说明磁盘堆栈对准对VB变量选择的影响。

一、什么是栈对齐?

简单地说,堆栈对位是指将堆栈存储器空间等间隔地分割成格子。 在32位计算机上,该等距离为4字节。 定位是指,使用堆栈时,起始地址必须在上述格子的起始位置。 也就是说,堆栈按4字节对齐。

二、为什么要对齐?

很整齐,操作方便,很快啊。 众所周知,GPU在处理浮点计算时比CPU快,因此配备高性能显卡可以大幅提高计算机的计算能力。 VB处理文件时,有随机文件和序列文件之分,但随机文件比序列文件快得多(每个随机文件的操作长度相同)。 内存页按4K对齐,硬盘也分区按4K对齐,这样的例子在计算机里数不胜数,但正因为整齐,速度才会更快。

整齐的背后,其实与寻址有关。 计算机代码都是通过缓存在CPU中运行的,但是这个缓存是寄存器。 在32位X86计算机上,寄存器为32位。 也就是说,堆栈按4个字节对齐,实际上与寄存器的容量和寻址能力对齐,避免在指令的执行中消耗过多的CPU时钟周期,从而提高运算性能。

三、VB变量的栈对齐表现

在上一篇文章中,介绍了VarPtr函数可以取变量指针,但是可以用它来看变量向堆栈的分配。

1、确认堆栈有4个字节

如果堆栈没有以4字节对齐,则4字节的变量地址不一定以4字节对齐。 我们可以多次尝试varptr(LNG )的返回值,但实际上是4的倍数。 其实,这个验证做得更多,但确实可以从现象中得到印证。

2、VB中Byte、Boolean、Integer和Long的资源开销是否一致?

为了验证,如下编写demo,编译为EXE。

点击查看大图

请执行并查看结果:

变量顺序: abcde

可以得到以下结论。

1 )各变量确实位于4字节齐全的位置。

)堆栈上的内存分配与变量的顺序一致。

)3) Byte、Boolean、Integer分配给堆栈的内存确实占了4个字节,和Long的开销相同。

你有点开心吗? 但是,不要太早高兴。 请在IDE环境中使用说明机制运行。

纳尼? 有情况

变量被分配给堆栈存储器时

ent: 2em;”>可得出什么结论:

(1)Long类型位于4字节对齐位置,其他显然没有。

(2)栈上内存分配与变量顺序一致。

(3)资源开销,貌似跟Long一样。

是不是可以下结论了呢?为了说明情况,我们增加1些变量,并将变量顺序打乱,再看看:

点击看大图

编译运行结果:

变量顺序为:aefcbgd

说明编译机制下,前述结论是正确的,那解释机制呢?

栈内存分布情况(变量顺序为:aefcbgd)

在IDE的解释机制下,可以说明:

(1)栈内存分配的确是4字节对齐的,栈内存分配顺序与变量顺序一致,但明显有按类组合的特性。

(2)Byte、Boolean、Integer在栈上的资源开销与Long不一致。

四、前述结论如何理解,是否具有普遍性呢?

其实栈对齐,是由编译器及具体的优化策略决定的。VB6与VC6的Debug版本的编译器及优化策略是一致的,VB6和VBA的IDE则完全是另外一套机制。通过前面的实验,可以看出,VB的编译机制,开销更大,而解释机制则开销更小。

那究竟哪种要好点呢?尽管二者都尽量与寄存器机制保持一致,但性能上是存在区别的。根据Intel手册,从AL/AH/AX换到EAX时,会有5-6个时钟周期的延迟,因此VB的解释机制,虽然节省资源,但性能却不如编译机制。

那究竟差异好大呢?其实在编码层,尤其是在IDE环境下,是感觉不到的。更何况VB的解释器是全部用汇编写的,性能非常强悍,也就是说,二者的差异可以忽略不计。但为什么还是会觉得VB6的编译比解释快呢?解释机制感觉起来很慢,是因为要逐行翻译代码,还得随时响应暂停等人机交互。尤其是VBA代码使用Office的GUI元素,系统还要处理大量的窗口消息,当然慢啦。

点击头像加关注,BtOfficer为你涨更多VB底层知识。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注