我将创建一些使用一些大型库DLL的命令行工具。出于安全考虑,我计划将DLL嵌入命令行的EXE中。
实施例: 假设CL(命令行工具)功能只是将文件从A复制到B.执行此操作的过程包含在100MB库DLL中。如果我只是从DLL中取出代码行并将它们粘贴到CL的代码中,那么CL将只有10Kb。 但是我不想这样做,所以我将完整的库嵌入到CL的EXE中,这将使它的大小达到101MB。
请注意以上只是一个例子。我曾经读过某个地方(不记得在哪里)Windows只会使用实际使用的EXE部分。所以,如果这是真的,那么EXE大小是10Kb,100MB还是1GB并不重要。我不知道这是不是真的,所以这就是我问这个问题的原因。
我拥有DLL的代码,所以如果最好的解决方案是不包含整个DLL但只是链接到或包含那些由CL使用的DLL项目的代码文件那么我会去那个方式。
所以问题是:10Kb CL运行速度更快,内存消耗比101MB CL还要少吗?
答案 0 :(得分:3)
首先,如果您为了安全原因而将额外的dll嵌入到可执行文件中,则不要。
如果程序可以解压缩,其他任何人都可以,所以如果您认为这会提高安全性,那么您只是在欺骗自己,除非您正在谈论工作安全。
其次,我怀疑这里的基本问题比其他人想象的要难得多。
如果您使用了常规非托管可执行文件和非托管dll,那么当您启动程序时,这些文件的一部分将保留在内存空间中,但只有您使用它的实际位将被映射到物理记忆。
换句话说,程序将消耗的实际物理内存量与您使用它们的代码量以及代码的分布方式成比例。我说“有些”,因为在页面基础上进行物理内存分页,页面具有固定大小。因此,100字节的函数可能最终将4KB的8KB页面(我不再记得页面的大小)映射到内存中。如果你调用了很多这样的函数,并且它们分散在代码的地址空间中,你可能最终会在很多物理内存中映射少量代码。
对于托管程序集,图片会有所改变。托管代码不会以相同的方式直接映射到物理内存中(注意,我在这里的细节上很模糊,因为我不知道确切的细节),因为代码还没有准备好运行。在它可以运行之前,它必须是JITted,而JITter只需要JITs代码就可以了。
换句话说,如果你在程序集中包含一个庞大的类,但从不使用它,它可能永远不会被JIT,因此不会使用任何内存。
答案是“否”,因为它不会使用更多内存?
我不知道。我怀疑更大的程序集会产生一些影响,更多的元数据会被放入反射表或诸如此类的东西。
但是,如果您打算将它放入可执行文件中,您需要在加载它之前将其解压缩到磁盘(这将“绕过”您的“安全功能”),或者将其解压缩到内存中(这需要全部那些100MB的物理内存。)
所以,如果你担心使用大量内存,这是我的建议:
答案 1 :(得分:1)
较小的一个会运行得更快并且消耗更少的内存吗?是。
是否足以发挥作用?谁知道?如果做错了,那么大的内存可能会占用大约100MB的内存(三次猜测我得到的数量)
但是,包含100MB不需要的'东西'肯定是非常愚蠢的......
编辑:我在这里的“是”应该是“无限小”,顺便说一下。见下面的评论。