是什么让EXE的规模增长?

jma*_*erx 13 c++

我的可执行文件大小为364KB.它没有使用Vector2D类,所以我用重载运算符实现了一个.

我改变了大部分代码

point.x = point2.x;
point.y = point2.y;
Run Code Online (Sandbox Code Playgroud)

point = point2;
Run Code Online (Sandbox Code Playgroud)

这导致删除了近1/3的代码行,但我的exe仍然是364KB.究竟是什么导致它的大小增长?

Ant*_*ony 11

编译器可能通过内联来优化运算符过载.所以它有效地编译成与原始示例相同的代码.因此,您可能通过重载赋值运算符来减少许多代码行,但是当编译器内联时,它会获取赋值运算符的内容并将其内联到调用点.

内联是可执行文件大小增加的方式之一.这不是唯一的方法,你可以在其他答案中看到.


Sig*_*erm 9

是什么让EXE的规模增长?

外部库,尤其是静态库和调试信息,代码的总大小,运行时库.更多代码,更多库==更大的exe.

要减小exe的大小,您需要使用gnu strip实用程序处理exe ,摆脱所有静态库,摆脱C/C++运行时库,禁用所有运行时检查并打开编译器大小优化.没有CRT的工作是一种痛苦,但它是可能的.还有一个wcrt(替代C运行时)库,用于创建小型应用程序(顺便说一下,它在过去的5年中没有更新/维护).

我用msvc编译器创建的最小的exe大约是16千字节.这是一个Windows应用程序,它显示单个窗口并运行所需的msvcrt.dll.我对它进行了一些修改,并把它变成了一个在显示器上消除画面的恶作剧.

对于令人印象深刻的exe大小减少技术,您可能需要查看.kkrieger.这是一个3D第一人称射击游戏,总共96千字节.该游戏具有大而详细的级别,支持着色器,实时阴影等.与Saurbraten相当(见截图).我遇到过的最小的工作窗口应用程序(带有音乐的3d演示)是4千字节大,并且使用了压缩技术和(可能)未记录的功能(即*.com executbale可以解压缩并在windows xp上启动win32 exe的事实).

在大多数情况下,只要合理(低于100兆字节),*.exe的大小就不会真正打扰你(我几年没见过磁盘).例如"不合理"的文件大小,请参阅Qt 4的调试版本以获取mingw.

这导致删除了近1/3的代码行,但我的exe仍然是364KB.

很可能是由编译器使用的外部库,运行时检查等引起的.此外,这是一个赋值操作.如果你没有使用x的自定义类型(带有复制构造函数),"复制"操作很可能导致少量操作 - 即删除1/3行并不能保证你的代码将是1/3短.

如果你想看看你的修改产生了多大的影响,你可以"要求"编译器为程序的两个版本生成asm列表,然后比较结果(手动或差异).或者您可以解析/比较两个版本的可执行文件.我确定使用GNU strip或删除额外的库比删除赋值运算符更有效.


Ebo*_*ike 6

什么类型的点?如果它是两个浮点数,那么编译器将隐式执行逐个成员的副本,这与您之前执行的操作相同.

编辑:显然今天的人群中的一些人不理解这个答案,并通过downvoting补偿.那么让我详细说明一下:

代码行与可执行文件大小无关.源代码告诉编译器要创建的组装线.一行代码可能会导致数百甚至数千个汇编指令.在C++中尤其如此,其中一行可能导致隐式对象构造,破坏,复制等.

在这种特殊情况下,我认为"point"是一个具有两个浮点数的类,因此使用赋值运算符将执行逐个成员的副本,即它将单独的每个成员复制并复制它.这与他之前做过的完全相同,只是现在已经隐含了.生成的程序集(以及可执行的大小)是相同的.