通过引入大型开关盒使我的Dll尺寸大大减弱,如何减小我的Dll尺寸(MSVC C ++)?

时间:2011-02-14 12:59:55

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

我的Dll大小为2 MB。现在我有一种情况需要添加一个带有2500个外壳臂的开关盒......每个案例都调用一个函数。因此,通过这个开关盒调用了2500个不同的功能,其中有2500个案例。 (2500个函数的完整代码已存在于2MB的DLL中。包含的额外代码仅为切换案例)。现在我的问题是,在版本构建中,Dll的大小增加了15 MB,导致DLL大小为17 MB,这根据我的要求是巨大的。请通过一些方法建议我通过正确处理开关盒来最小化我的Dll尺寸..任何替代方法..
我正在使用MSVC 2005,c / c ++。我调用优化来最小化大小(/ 01),/ ltcg,(/ OPT:REF),(/ OPT:ICF)等。所有最佳可能的优化功能。 (不使用预编译头文件)

您的建议非常需要

先谢谢 阿尼尔

4 个答案:

答案 0 :(得分:3)

如果所有函数都具有相同的签名,请考虑使用函数指针填充map或类似的数据结构,并将其作为查找键进行切换。没有人能够理解2500个案例的switch语句,所以我建议你的代码中没有一个。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

另外,我敢打赌那2500个功能含有大量气体。如果switch语句是调用它们的唯一方法,它们可以在switch语句中直接扩展,从而节省了大量的进入/退出代码。

答案 3 :(得分:0)

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

非常有趣