减少可执行文件大小 - 注释掉调用/使用与删除文件/文件夹

时间:2015-02-18 12:07:36

标签: c++ c++11 dll linker

我的目标是减少现有Visual Studio 2013 C ++项目的二进制大小。

根据我之前的半相关question的理解,如果使用代码,Linker将包含二进制文件中的代码片段,。< / p>

作为我尝试识别项目中哪些组件(类/文件夹/过滤器)最大的一部分,我尝试了以下内容:

  1. 注释掉这些组件的来电/使用情况。
  2. 1 +从我的项目中完全删除这些组件(文件/文件夹)。
  3. 我希望2在二进制大小方面提供与1相同的结果。 然而,发现使用2对尺寸的影响更大,意味着尺寸减小要好得多。

    问题

    1. 我的假设是否有效(2给出的结果与1相同)?
    2. 如果是这样,为什么我没有得到预期的结果?
    3. 更新1

      似乎Linker仍然包含未使用函数的代码,好像它的逻辑告诉它它不能排除这些函数,因为它们可能以某种方式使用(例如:导出函数) 提醒一下,我想要排除的功能/类不会被导出。

      示例1

      void func(HINSTANCE, LPVOID lpReserved)
      {
         // do nothing
      }
      
      BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
      {
         // do nothing
      }
      

      生成大小约为300KB的DLL

      示例2

      void func(HINSTANCE, LPVOID lpReserved)
      {
         // do something huge
      }
      
      BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
      {
         // do nothing
      }
      

      生成大小约为400KB的DLL

      问题:

      生成DLL时,如果未使用/调用函数且未导出函数,为什么链接器会包含其代码?

      我根据Do unused functions get optimized out?

      配置了Linker个标记

0 个答案:

没有答案