前言
要论埋雷,还得是定长字符串
前面章节都讲的不定长字符串,那既然有不定长的,自然就有定长字符串。用"Dim uStr As String*N"就可以声明一个N字符大小的定长字符串。定长字符串有什么特点或好处呢?
顾名思义,那自然是多了截断,少了自动补空白符。这在早期的纯字符UI应用中,在需要限制输入长度的场景中,是很有用处的。如果深入一点,不难发现,定长字符串的内存是分配在栈上的。这和不定长字符串数据内存分配在堆上,有很大的不同。
我们都知道,栈要比堆要快得多,虽然栈严格意义来说也是堆的一种。在《如何在VB/VBA中分配高性能内存,用硬件来提升代码性能?》一文中,就提到了使用栈内存,可以大幅提升代码性能。这看上去有点“堆硬件”的暴力美学,但的确有效。
既然定长字符串数据分配在栈上,那自然是要比分配在堆上的不定长字符串要快的。对于该结论,若不假思索地套用,估计就会掉坑里了。因为,虽然该结论是正确,但通常情况下,VB/VBA用户却是鞭长莫及,是够不着的。
为何?这就是字符串的秘境。有现成的高性能姿势,却往往见而不得,倘若没弄懂原理,就只能干着急,甚至深受其害而不自知。比如,直接使用定长字符串来提升性能,它不仅不能提升性能,还反倒降低了一倍的性能。
那么本文,就给详细拾掇拾掇定长字符串,看看它和想象中的是否错得离谱?
一、定长字符串迷惑之StrPtr返回数据地址的真真假假

