gpt4 book ai didi

c# - 为什么我会选择 512 以外的 C# 编译器文件对齐设置?

转载 作者:IT王子 更新时间:2023-10-29 03:55:31 25 4
gpt4 key购买 nike

我可以在 MS Docs 中看到如何更改 C# 编译的文件对齐方式(通过项目设置和命令行)。

我在谷歌上搜索并看到文章解释了 512 字节的文件对齐会减少 .dll 的大小。我用不同的文件对齐方式对自己进行了测试,发现确实如此。

我的问题是:

为什么我要使用不同的文件对齐方式?一定有需要这样做的情况,否则就没有这个选项?

此外,它具体是做什么的? MSDN 页面谈论部分?什么是版 block ?

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/advanced#filealignment

最佳答案

这是一个相当技术性的实现细节。要开始使用,您首先必须了解 PE32 文件的结构,即 Windows 中 DLL 和 EXE 的文件格式。相关的规范文章是 Matt Pietrik 的“Peering Inside the PE, A Tour of the Win32 Portable Executable File Format”。 17 年前写的,但仍然相关 and available .

/filealign 设置是指 IMAGE_OPTIONAL_HEADER.FileAlignment 字段的值。它决定了一个部分中的原始数据如何对齐。节是文件中的一大块代码或数据。在纯 .NET 程序集的情况下几乎完全是数据。

文件格式和磁盘之间有着非常密切的关系。可执行镜像用作 Windows 中内存映射文件的支持文件。通过将文件映射到虚拟内存地址空间来加载可执行文件。非常高效,加载 DLL 仅涉及创建该映射,不会从文件中读取实际数据。当进程试图从一个部分读取一个字节时,这种情况会以惰性方式发生。如果它还没有加载到内存中,就会产生页面错误,操作系统从文件中读取 4096 字节到内存中。最大的优势是您无需为不使用的数据或代码付费。这也是第一次阅读 [attributes] 时成本很高的原因。

文件对齐的相关性是各部分中原始数据的排列方式。大多数包含机器代码的现代可执行文件使用 4096 字节的对齐方式,即虚拟内存页的大小。这与包含托管代码的程序集不是很相关,IL 只是数据。使用更小的对齐方式是有意义的,因为它会浪费更少的空间。 512 字节(不是千字节)是一个令人高兴的数字,它是 PE32 格式中允许的最小值。

我能想到的将选项添加到 UI 的唯一可能原因是,与其他编译器相比,C# 编译器的编译选项非常少。 “其他”是生成 native 代码的编译器。所以有这个选项是因为编译器有这个选项。 [属性] 涵盖了很多调整,很好地使编译器命令行简短而活泼。但是文件对齐没有属性,需要在生成文件之前知道,属性就来不及了。

相反的例子是 C++ 编译器和链接器,IDE 提供了 19 属性页来设置它们。但还是不能全部覆盖,真正晦涩难懂的还得在“命令行”选项页中设置。

关于c# - 为什么我会选择 512 以外的 C# 编译器文件对齐设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5206312/

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