【问题标题】:my Dll size blown out by introducing large switch cases, how can I reduce my Dll size(MSVC C++)?我的 Dll 大小因引入大型开关盒而爆裂,如何减小我的 Dll 大小(MSVC C++)?
【发布时间】:2011-06-26 22:01:49
【问题描述】:

我的 Dll 大小为 2 MB。现在我有一种情况,我需要添加一个带有 2500 个机箱臂的开关机箱。每个机箱都调用一个函数。因此,通过这个包含 2500 个 case 的 switch case 总共调用了 2500 个不同的函数。 (2MB 的 DLL 中已经存在 2500 个函数的全部代码。包含的额外代码仅是 switch case)。现在我的问题是,Dll 的大小在 Release 版本中增加了 15 MB,导致 DLL 大小变为 17 MB,这根据我的要求是巨大的。请给我一些建议,通过正确处理开关盒,我可以将我的 Dll 大小保持在最低限度.. 任何替代方法..
我正在使用 MSVC 2005,c/c++。我调用了优化来最小化大小(/01)、/ltcg、(/OPT:REF)、(/OPT:ICF)等..所有可能的最佳优化功能。 (不使用预编译头文件)

非常需要您的建议

提前致谢 阿尼尔

【问题讨论】:

  • 你这样做是为了什么?你为什么选择这个设计?你想达到什么目的?几乎可以肯定有更好的方法来做任何事情。
  • 我认为这几乎就是他寻求帮助的原因......?
  • @JohnB - 这是真的,但他想要的答案会有所不同,具体取决于他最初提出 2500 外壳开关设计的原因。
  • 你确定所有的代码都已经在DLL中了吗?链接器可能会因为未使用而将其丢弃。
  • 希望代码自动生成...

标签: c++ visual-c++ optimization case switch-statement


【解决方案1】:

如果所有函数都具有相同的签名,请考虑使用函数指针填充 map 或类似的数据结构,并将您打开的内容作为查找键。没有人能够理解包含 2500 个 case 的 switch 语句,因此我建议您的代码中不要包含一个。

【讨论】:

  • 感谢您的建议,我在 200 个函数/案例的样本中尝试使用映射和函数指针。我观察到我的 dll 大小仍然随着映射而增加,但随着函数指针而减小,但不是显着(每 200 例仅减少 0.1 MB)。现在我想看看当我申请总共 2500 个案例时的变化。我有点困惑我的函数 ptr 表是否会将 2500 个函数名作为数组元素。完成后我会更新。
【解决方案2】:

几乎可以肯定,您的案例块中有很多重复的代码(通过宏/内联函数/STL)。更改您的案例以使用带有参数的 非内联 函数,以将每个案例块减少为仅“HandleGenericCase(x);”。不要在案例块中使用 STL 或其他模板/内联代码。

没有看到您的代码,很难给出一个好的答案,在这种情况下,“验证膨胀的具体原因”确实是最好的建议。

【讨论】:

  • 感谢 Tenfour,我正在调查我的代码是否会导致臃肿……因为我认为应该与 switch case 和 DLL 的大小无关
  • 如果您可以粘贴案例块的示例以及您在该块中调用的函数的函数签名,这将有所帮助。
【解决方案3】:

即使 switch 语句每个 case 占用 100 字节,也只有 1/4 MB,而且可能要少得多。

你能得到一个dll的映射文件吗?我会这样做,然后随机抽样几次,看看里面有什么功能。我敢打赌,里面充满了你并不真正需要的东西,通常是由模板生成的。

另外,我敢打赌,这 2500 个函数包含大量气体。如果 switch 语句是它们被调用的唯一方式,它们可以在 switch 语句中直接展开,节省大量的进入/退出代码。

【讨论】:

  • 是的,我的函数中有一些通用代码,正如你所建议的,我不能在 switch 案例中直接展开内联代码,因为这些函数的代码在 200 行到 400 行之间。我正在查看我的代码以查找导致膨胀的原因.. 因为我认为应该与 switch 案例和 DLL 的大小没有联系
  • @Anil:2500 个函数乘以 300 行/函数 = 仅在函数中的 750,000 行代码,给予或接受。这是巨大的。
  • 是的,那是巨大的,整个代码长度大约是 900,000 行.. 努力减少它.. 可能会减少到 750,000 行。
  • @Anil:我敢打赌,如果你带来一只重构秃鹰,它会自己吃饱,并喂饱它所有的朋友。
【解决方案4】:

通过最初的试验,我得出的结论是,当我们尝试使用函数指针时,没什么大不了的。我发现连续的 switch 案例和函数指针几乎与我的要求相同,因为地图使我的 Dll 大小更加膨胀。这里的问题不在于我认为的 switch 案例,而是我在调用的函数中编写的代码。我使用了许多 STL,一些通用代码..还有一些像字符串这样的东西..我我正在查看导致代码膨胀的原因。我可能需要一些时间才能使我的代码高效。这个答案是为像我这样的初学者提供一个想法,并要求有经验的人提出一些代码在哪里以及如何膨胀的问题。(当然我不会忘记谷歌)我仍然有很多循环和差距..我需要找出编译器生成代码时会发生什么......这很有趣

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-26
    • 2019-11-30
    • 2012-03-26
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多