C++ 是什么使EXE';它变大了吗?

C++ 是什么使EXE';它变大了吗?,c++,C++,我的可执行文件大小为364KB。它没有使用Vector2D类,所以我用重载运算符实现了一个 我更改了我的大部分代码 point.x = point2.x; point.y = point2.y; 到 这导致我删除了将近1/3的代码行,但我的exe仍然是364KB。到底是什么原因导致它变大的?点是什么类型的?如果是两个浮点数,那么编译器将隐式地执行一个成员一个成员的复制,这与您之前所做的相同 编辑:很显然,今天的人群中有些人不明白这个答案,于是投了反对票。因此,让我详细说明: 代码行与可执行文件

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

我更改了我的大部分代码

point.x = point2.x;
point.y = point2.y;


这导致我删除了将近1/3的代码行,但我的exe仍然是364KB。到底是什么原因导致它变大的?

点是什么类型的?如果是两个浮点数,那么编译器将隐式地执行一个成员一个成员的复制,这与您之前所做的相同

编辑:很显然,今天的人群中有些人不明白这个答案,于是投了反对票。因此,让我详细说明:

代码行与可执行文件大小无关。源代码告诉编译器要创建什么装配线。一行代码可能导致成百上千条汇编指令。C++中特别如此,其中一行可能导致隐式对象的构造、破坏、复制等。
在这种特殊情况下,我假设“point”是一个具有两个浮点数的类,因此使用赋值运算符将执行一个成员一个成员的复制,即它单独获取每个成员并复制它。这和他以前做的完全一样,只是现在它是隐式的。生成的程序集(和可执行的大小)是相同的。

可执行文件通常以页大小而不是离散字节大小。

< P>当编译C或C++程序到可执行文件时,编译器将代码转换成机器代码,并根据其适用性进行优化。
但简单地说,代码越多=要生成的机器代码越多=可执行文件的大小越大。

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


内联是可执行文件的一种增长方式。正如你在其他答案中所看到的那样,这不是唯一的方法。

一些要查看的链接

对于Windows,VC++中的许多编译器选项可能会被激活,如RTTI、异常处理、缓冲区检查等,这可能会在幕后增加更多的总体大小

是什么使EXE的大小增长

外部库,特别是静态库和调试信息、代码的总大小、运行库。代码越多,库越多==exe越大

要减小exe的大小,您需要使用实用程序处理exe,去掉所有静态库,去掉C/C++运行时库,禁用所有运行时检查并启用编译器大小优化。在没有CRT的情况下工作是痛苦的,但这是可能的。此外,还有一个(可选的C运行时)库,用于创建小型应用程序(顺便说一句,它在过去5年中没有更新/维护)

我能用msvc编译器创建的最小exe大约是16KB。这是一个显示单个窗口的windows应用程序,需要运行msvcrt.dll。我对它做了一些修改,把它变成了恶作剧,抹掉了显示器上的画面

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

在大多数情况下,*.exe的大小不应该真的困扰您(我已经好几年没看到软盘了),只要它是合理的(低于100兆字节)。有关“不合理”文件大小的示例,请参见mingw的Qt4调试版本

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

最有可能的原因是编译器使用的外部库、运行时检查等。 此外,这是一个赋值操作。如果您不使用x的自定义类型(使用复制构造函数),“复制”操作很可能会导致少量操作,即删除1/3行并不能保证代码缩短1/3


如果您想查看修改所产生的影响,您可以“要求”编译器为两个版本的程序生成asm列表,然后比较结果(手动或使用diff)。或者,您可以禁用/比较两个版本的可执行文件。但我确信,使用GNU strip或删除额外的库比删除赋值运算符效果更好。

我认为这是一个很好的例子,如果您有一个好的优化编译器,就不必太担心代码过于冗长。相反,请始终清楚地编写代码,以便其他程序员可以阅读您的代码,并将优化留给编译器。

此外,请检查是否有大量静态/全局对象。这将大大增加您的exe大小,如果他们不是零初始化

例如:

int temp[100] = {0};
int main()
{

}
在我的linux机器上,上述程序的大小是9140字节

如果我将临时数组初始化为5,那么大小将增加大约400字节。以下程序在我的linux机器上的大小是9588

int temp[100] = {5};
int main()
{

}

这是因为,零个初始化的全局对象进入.bss段,在程序启动期间,该段将立即初始化。其中作为非零初始化对象的内容将嵌入exe本身。

为什么会更少
point=point2
正在做与以前完全相同的工作(在操作符内部),只是使用了不同的界面。@GMan:这就是他问这个问题的原因……也许他认为exe的大小是根据代码行数增长的。我将对此进行投票,只是因为这是一个re
int temp[100] = {5};
int main()
{

}