【发布时间】:2020-11-29 07:54:23
【问题描述】:
谁能详细解释哪些因素会增加 C++ 中可执行文件的输出大小?我知道通过测试增加文件大小的事情包括库和内置变量类型。我还在这里读到构建模式(发布与调试)也可以增加 exe 文件的大小?我不确定的是,如果程序中的实际行数(取决于行content) 起作用,还有哪些其他因素会增加 .exe 文件的大小。
【问题讨论】:
标签: debugging build size executable release
谁能详细解释哪些因素会增加 C++ 中可执行文件的输出大小?我知道通过测试增加文件大小的事情包括库和内置变量类型。我还在这里读到构建模式(发布与调试)也可以增加 exe 文件的大小?我不确定的是,如果程序中的实际行数(取决于行content) 起作用,还有哪些其他因素会增加 .exe 文件的大小。
【问题讨论】:
标签: debugging build size executable release
在调试模式下,有时在 .exe 文件中有调试信息,有时在外部 pdb 文件中。 (取决于使用的编译)。 此外,调试模式通常具有较少的优化并使用更多的指令。 (就像经常不必要地加载和存储变量一样)。 另一方面,在发布版本中,应用了一些优化。它们可以同时具有这两种效果。它们要么增加文件的大小(如函数内联或循环展开),要么减小文件大小(删除不必要的指令或合并它们)。 此外,符号通常在发布版本中被剥离。
如果您静态链接,所有必需的文件/函数都包含在最终的可执行文件中 ==> 更大的可执行文件(通常) 如果动态链接,最终可执行文件中只有对库的引用,因此文件大小更小。
模板确实增加了文件的大小,对于每种应用模板的类型,都必须生成机器代码。 因此,如果您大量使用模板(例如使用 Boost),您将获得一个很大的可执行文件。
我不确定的是,如果变量中的实际值大小(如值为 5 的 int 和值为 100,000,000 的 int)增加 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
}
对
void foo(int a,int b,int c, double d){
if(a<50) baz(a);
}
它们都将编译为相同的代码。此外 cmets 不计入可执行文件,除非编译器决定将 cmets 添加到可执行文件中(我不知道任何编译器,它正在做类似的事情)。
【讨论】: