发布
社区首页 >问答首页 >哪些内容/因素会增加C++程序可执行文件的大小?

哪些内容/因素会增加C++程序可执行文件的大小?
EN

Stack Overflow用户
提问于 2020-08-09 23:03:00
回答 1查看 249关注 0票数 1

谁能详细解释一下,在C++中,究竟是什么因素增加了可执行文件的输出大小?我从测试中知道的增加文件大小的东西是,包括库和内置的变量类型。我也在这里看到过构建模式(发布与调试)也会增加exe文件的大小?我不确定的是,像int这样值为5的变量,vs值为100,000,000的int变量中的实际值大小是否会增加exe大小,程序中的实际行数(取决于行的内容)是否会起作用,还有哪些其他因素会增加.exe文件的大小。

EN

回答 1

Stack Overflow用户

发布于 2020-08-09 23:16:43

  1. 调试vs Release

在debug模式下,有时在.exe文件中有debuginfos,有时在外部pdb文件中。(取决于使用的编译)。此外,通常调试模式的优化较少,使用的指令要多得多。(比如经常不必要地加载和存储变量)。另一方面,在发布版本中,会应用一些优化。它们可以同时具有这两种效果。它们要么增加文件的大小(如函数内联或循环展开),要么减小文件的大小(删除不必要的指令或合并它们)。此外,在发布版本中,符号经常被剥离。

  1. 静态链接与动态链接

如果静态链接,所有需要的文件/函数都包含在最终的可执行文件==>较大的可执行文件(通常)中。如果动态链接,则最终可执行文件中只有一个对库的引用,因此文件大小较小。

  1. (特定于C++)模板

模板确实增加了文件的大小,因为对于每种类型,在应用模板的地方,都必须生成机器码。正因为如此,如果你大量使用模板(比如使用Boost),你会得到一个很大的可执行文件。

我不确定的是,像

这样值为5的变量与值为100,000,000的变量中的实际值size是否会增加exe大小

这不会有什么区别,因为两者都需要4个字节。除非编译器决定进行优化,只对5使用一个字节。如:

代码语言:javascript
代码运行次数:0
复制
mov al, 5 ;(Save some bytes)
vs
mov eax, 5

如果程序中的实际行数...扮演着重要的角色

是的,更多的行,更多的代码。但是您不能将代码行转换为可执行文件的大小。考虑一下:

代码语言:javascript
代码运行次数:0
复制
void foo(int a,
         int b,
         int c,
         double d) 
{
    if (a<50)
    {
      baz(a);
    }
    //Do something
}

vs

代码语言:javascript
代码运行次数:0
复制
void foo(int a,int b,int c, double d){
   if(a<50) baz(a);
}

所有这些都将编译成相同的代码。此外,注释不会计入可执行文件,除非编译器决定将注释添加到可执行文件中(我不知道有任何编译器会这样做)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63327854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档