谁能详细解释一下,在C++中,究竟是什么因素增加了可执行文件的输出大小?我从测试中知道的增加文件大小的东西是,包括库和内置的变量类型。我也在这里看到过构建模式(发布与调试)也会增加exe文件的大小?我不确定的是,像int这样值为5的变量,vs值为100,000,000的int变量中的实际值大小是否会增加exe大小,程序中的实际行数(取决于行的内容)是否会起作用,还有哪些其他因素会增加.exe文件的大小。
发布于 2020-08-09 23:16:43
在debug模式下,有时在.exe文件中有debuginfos,有时在外部pdb文件中。(取决于使用的编译)。此外,通常调试模式的优化较少,使用的指令要多得多。(比如经常不必要地加载和存储变量)。另一方面,在发布版本中,会应用一些优化。它们可以同时具有这两种效果。它们要么增加文件的大小(如函数内联或循环展开),要么减小文件的大小(删除不必要的指令或合并它们)。此外,在发布版本中,符号经常被剥离。
如果静态链接,所有需要的文件/函数都包含在最终的可执行文件==>较大的可执行文件(通常)中。如果动态链接,则最终可执行文件中只有一个对库的引用,因此文件大小较小。
模板确实增加了文件的大小,因为对于每种类型,在应用模板的地方,都必须生成机器码。正因为如此,如果你大量使用模板(比如使用Boost),你会得到一个很大的可执行文件。
我不确定的是,像
这样值为5的变量与值为100,000,000的变量中的实际值size是否会增加exe大小
这不会有什么区别,因为两者都需要4个字节。除非编译器决定进行优化,只对5使用一个字节。如:
mov al, 5 ;(Save some bytes)
vs
mov eax, 5
如果程序中的实际行数...扮演着重要的角色
是的,更多的行,更多的代码。但是您不能将代码行转换为可执行文件的大小。考虑一下:
void foo(int a,
int b,
int c,
double d)
{
if (a<50)
{
baz(a);
}
//Do something
}
vs
void foo(int a,int b,int c, double d){
if(a<50) baz(a);
}
所有这些都将编译成相同的代码。此外,注释不会计入可执行文件,除非编译器决定将注释添加到可执行文件中(我不知道有任何编译器会这样做)。
https://stackoverflow.com/questions/63327854
复制相似问题