gpt4 book ai didi

c# - 为什么可变长度不会增加程序集的大小?

转载 作者:太空宇宙 更新时间:2023-11-03 19:06:25 25 4
gpt4 key购买 nike

我写了一个没有做任何有用的程序,这是static void Main(string[] args):

int a = 0;
a++; // ... for another 2048 times
// not in a for loop or something
// just this a++ 2048 times

它是用默认的控制台应用程序类编写的,是的。它就是这样做的。正好是 12.800 字节。

然后我将变量 a 更改为 someSortOfRidiculousSuspiciousWeirdAndSuperSuperEnormousMegaHyperGigaVariableNameThatsNotReallyFunToReadOrWrite。我编译了它,大小完全一样(12.800 字节)。

这是为什么呢?如果我反编译它,我可以看到长文件名。我还看到调用变量根本不会增加大小,因为它与某种数字相关联,如果它是 a 则该数字会相同。然而我看到了这个:

.locals init
(
[0] int32 someSortOfRidiculousSuspiciousWeirdAndSuperSuperEnormousMegaHyperGigaVariableNameThatsNotReallyFunToReadOrWrite
)

当它再次被替换为 num1(不是 a,如您所想)时,它会显着变小,但我无法在文件大小!

这是为什么?

另外:我认为 assemlby 的属性窗口(清除:右键单击窗口中的文件 --> 属性)不正确。当我添加一些 Console.WriteLine("Test") 时,大小也不会增加。

编辑:人们建议让我的变量名 > 512 字节。如果我的变量名达到 > 512 个字符(512 字节),我会收到编译器错误“标识符太长”

最佳答案

这受 PE32 文件的内部结构、Windows EXE 和 DLL 文件的文件格式影响。此文件中的部分具有最小大小。实际上由项目中的设置控制。项目 + 属性,构建选项卡,高级按钮,文件对齐设置。任何 C# 项目都将此设置为 512 字节,这是 PE32 文件允许的最小值。

进一步的细节是局部变量会发生什么。变量的名称实际上并未存储在 .NET 程序集中。您使用的反编译器从 PDB 文件中检索了它。否则,ILSpy 和 Reflector 等反编译器需要在您没有 PDB 的程序集(例如 .NET Framework 程序集)上为局部变量生成伪名称的原因。

因此无论您为变量选择什么名称,程序集都不会变大。只是 PDB 文件。并且您所做的更改需要添加至少 511 字节的 MSIL 和/或元数据才能可靠地增加 EXE/DLL 文件的大小。

关于c# - 为什么可变长度不会增加程序集的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26660576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com