当我使用条件编译参数排除代码时,为什么VB6 EXE文件大小没有变化?

时间:2012-11-10 07:48:24

标签: performance compiler-construction vb6 compilation compiler-optimization

基本上,在我的VB6代码中声明Windows API函数时,会出现这些需要声明或使用此函数的常量,事实上,通常大部分常量都不会被使用而你只会使用一个在进行API调用时它们是左右,所以我使用条件编译参数来使用以下内容排除这些(和其他内容):

IncludeUnused = 0 : Testing = 1

(这就是我设置两个条件编译参数的方法(默认情况下它们是布尔类型)。

因此,许多未使用的东西被排除在外:

#If IncludeUnused Then
' Some constant declarations and API declarations go here, sometimes functions
' and function calls go here as well, so it's not just declarations and constants
#End If

我还使用类似的包装器,使用VB6属性窗口“Make”选项卡中 Conditional Compilation Argument 输入字段中声明的 Testing 布尔值。 测试布尔值用于在我处于测试模式时显示消息框和类似的内容,当然,如果我有测试设置为0(当我测试时它显然是1)。

问题是,我尝试将 IncludeUnused 测试设置为0和1,反之亦然,总共有四(4)种组合,无论我是什么组合设置这些值,我的VB6 EXE的输出EXE文件大小不会改变!使用快速代码编译为本机代码时,以及使用小代码时,总是49,152。

此外,如果我在测试 IncludeUnused 的四(4)种组合下编译为p代码,我总是以文件大小32,768结束,无论如何

这让我发疯,因为它让我相信实际上并没有发生任何变化,即使它确实存在。为什么当从编译中排除代码段时,文件大小仍然相同?我错过了什么或做错了什么,或者我错误估算了什么?

我已经考虑过这样的选项,也许VB6自动不会编译未用于最终输出EXE的代码,但我从一些消息来源读到这不是真的,因为,如果包含它,它会被编译(如果我错了,请纠正我),如果这是正确的,那么就不需要使用 IncludeUnused 布尔来删除未使用的代码......?

如果有人能够对这些想法有所了解,我会非常感激。

4 个答案:

答案 0 :(得分:5)

很可能是大小差异非常小,并且exe大小被填充到下一个512或1024字节对齐。尝试使用zip压缩exe文件,看看zip文件大小是否不同。

答案 1 :(得分:2)

你误解了编译器的作用。 VB6编译器的输出是代码。常量只是值的占位符,它们不是代码。编译器将它们添加到其符号表中。当它稍后遇到使用常量的代码中的语句时,替换为常量的值。无论您是使用常量还是硬编码语句中的值,该语句都会产生完全相同的代码。

因此,这自动暗示如果您从未在任何地方实际使用常量,那么在生成的代码中根本没有任何区别。使用#If完成的所有操作就是保持编译器的符号表更小。这是没有意义的事情,你获得的编译速度的实际收益是无法衡量的。符号表实现为哈希表,它们具有O(1)摊销的复杂性。

仅使用常量来使代码更具可读性。并且如果需要,可以很容易地改变恒定值。通过使用#If,您实际上使您的代码更少可读。

答案 2 :(得分:2)

VB6可执行文件大小填充到4KB块,因此如果代码差异很小,则对可执行文件没有任何影响。

答案 3 :(得分:1)

您无法在条件编译指令中测试运行时数据。

这些指令使用由文字值,运算符和CC常量组成的表达式。设置常量值的一种方法是:

#Const IncludeUnused = 0
#Const Testing = 1

您还可以通过Project Properties进行IDE测试来定义它们。转到该对话框中的“制作”选项卡,然后单击“帮助”按钮以获取详细信息。

也许这就是你设置值的地方?如果是这样,请考虑这只是后来读者的其他信息,而不是答案。

请参阅#If...Then...#Else Directive