You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

g++编译速度是否通常远慢于gcc?我的编译耗时是否正常?

问题

由于大学课程要求,我过去几个月一直在用纯C语言编程,编写的程序很小且对资源要求极低,用gcc编译几乎瞬间完成(目前最大的程序仅耗时40ms)。

最近我参加了一个本地竞赛,该竞赛通常使用C++,因此我开始练习。尽管编写的程序仍然极小(甚至不到0.5kB),但我发现用g++编译时总会先有大约0.2秒的延迟,之后才是我熟悉的gcc那样的瞬间编译。

我当前测试的代码如下:

//#include <bits/stdc++.h> // 我注释掉了这行,原以为问题是因为包含了太多头文件
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std; // 我知道这不算好实践,但竞赛里大家都说这么写方便

int mex(vector<int> arr, vector<int> subarr) {
    int min = INT_MAX;

    for (auto i : arr) {
        // 如果i不在subarr中
        if (find(subarr.begin(), subarr.end(), i) == subarr.end()) {
            if (i < min) {
                min = i;
            }
        }
    }

    return min;
}

int main () {
    vector<int> a = {0,1,2,3,4,5};
    vector<int> suba = {0, 1,3,4};

    cout << mex(a, suba) << endl;

    return 0;
}

这段代码编译耗时240ms。以下是g++的ftime-report输出:

Time variable                                   usr           sys          wall           GGC
 phase setup                        :   0.00 (  0%)   0.00 (  0%)   0.00 (  0%)  1562k (  2%)
 phase parsing                      :   0.16 ( 84%)   0.13 ( 87%)   0.29 ( 85%)    60M ( 83%)
 phase lang. deferred               :   0.01 (  5%)   0.01 (  7%)   0.02 (  6%)  5818k (  8%)
 phase opt and generate             :   0.02 ( 11%)   0.01 (  7%)   0.03 (  9%)  5468k (  7%)
 |name lookup                       :   0.05 ( 26%)   0.02 ( 13%)   0.03 (  9%)  2550k (  3%)
 |overload resolution               :   0.01 (  5%)   0.00 (  0%)   0.02 (  6%)  6891k (  9%)
 callgraph construction             :   0.01 (  5%)   0.00 (  0%)   0.01 (  3%)  1448k (  2%)
 df scan insns                      :   0.01 (  5%)   0.00 (  0%)   0.00 (  0%)  4128  (  0%)
 preprocessing                      :   0.01 (  5%)   0.05 ( 33%)   0.05 ( 15%)  1805k (  2%)
 parser (global)                    :   0.03 ( 16%)   0.02 ( 13%)   0.07 ( 21%)    16M ( 23%)
 parser struct body                 :   0.00 (  0%)   0.03 ( 20%)   0.03 (  9%)    11M ( 15%)
 parser function body               :   0.03 ( 16%)   0.00 (  0%)   0.03 (  9%)  3231k (  4%)
 parser inl. func. body             :   0.01 (  5%)   0.02 ( 13%)   0.01 (  3%)  1474k (  2%)
 parser inl. meth. body             :   0.01 (  5%)   0.00 (  0%)   0.03 (  9%)  5790k (  8%)
 template instantiation             :   0.07 ( 37%)   0.02 ( 13%)   0.08 ( 24%)    19M ( 27%)
 constant expression evaluation     :   0.00 (  0%)   0.00 (  0%)   0.01 (  3%)    85k (  0%)
 expand                             :   0.00 (  0%)   0.01 (  7%)   0.00 (  0%)   367k (  0%)
 integrated RA                      :   0.00 (  0%)   0.00 (  0%)   0.00 (  0%)  2092k (  3%)
 LRA non-specific                   :   0.00 (  0%)   0.00 (  0%)   0.01 (  3%)    14k (  0%)
 symout                             :   0.01 (  5%)   0.00 (  0%)   0.00 (  0%)  6907k (  9%)
 rest of compilation                :   0.00 (  0%)   0.00 (  0%)   0.01 (  3%)   212k (  0%)
 TOTAL                              :   0.19          0.15          0.34           73M

我使用的是Ubuntu 22.04系统上的gcc和g++ 11.4.0版本。请问这种情况正常吗?g++通常会比gcc慢这么多吗?还是我的电脑存在潜在问题?

回答

这种情况完全正常,不是你的电脑有问题,g++编译C++代码确实普遍比gcc编译C代码慢不少,核心原因有这几点:

  • 模板实例化开销大:从你的ftime-report能看到,template instantiation(模板实例化)占了编译时间的24%。C++标准库大量依赖模板(比如vector、find都是模板实现),编译时编译器需要为你使用的具体类型(比如vector<int>)生成专属代码,这个过程远比处理C的静态类型复杂。
  • 标准库复杂度差异:哪怕只包含几个C++头文件,这些头文件内部也会引入大量模板定义、重载函数、类型别名等内容,编译器需要处理的代码量远大于同等功能的C头文件。比如vector的实现包含了大量成员函数、迭代器定义,而C的数组完全不需要这些额外处理。
  • C++语言特性的额外处理:C++支持重载、名字空间、面向对象等特性,编译器需要完成名字查找、重载决议这些额外工作——从报告里的name lookup和overload resolution也能看到这些环节的开销,而C语言没有这些特性,编译流程简单得多。

如果想稍微加快编译速度,可以试试这些小技巧:

  • 使用预编译头:把常用的C++头文件(比如你注释掉的<bits/stdc++.h>)预编译,这样每次编译不用重复处理这些头文件内容。
  • 配合增量编译工具:用Make、CMake这类构建工具,只编译修改过的代码,避免重复处理未变更的部分。
  • 减少不必要的模板使用:竞赛场景下虽然刚需不多,但小代码里能简化的地方可以适当调整。

总的来说,你遇到的0.2-0.3秒编译延迟在C++编译里属于正常范围,尤其是使用标准库模板的情况下,完全不用担心电脑有问题。

内容的提问来源于stack exchange,提问作者VirtualCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 22:45:00