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

求符合标准的C代码以C++编译后性能显著变化的实例

符合C11与C++标准的代码在两种编译环境下的性能差异问题

前置说明

  • 注:该问题可能已有人提出
  • 更新记录:
    • 更新1:补充关注性能提升的情况
    • 更新2:参考相关问题:同时符合C和C++标准的代码在两种语言编译下行为是否不同?
    • 更新3:明确讨论范围:仅关注**严格符合C11标准(C11, 4p5)**的C代码,且该代码同时是无未定义行为(UB)、未指定行为(UnspecB)、实现定义行为(IB)的良构C++程序,需满足:
      1. 无N4917标准中第5至33条款及附录D的规则违反
      2. 具备相同的抽象语义

核心问题

是否存在这样的C代码,以C++编译后性能出现显著下降或提升?


存在性能显著提升的情况

最典型的场景是**const变量的编译期常量处理差异**:
在C11标准中,const修饰的变量并非默认的编译期常量,仅当它被常量表达式初始化时,部分上下文可被当作常量使用(但仍不能用于声明固定大小数组,只能作为变长数组(VLA)的大小);而在C++中,用常量表达式初始化的const变量会被视为编译期常量,编译器可基于此进行更激进的优化。

示例代码:

#include <stdio.h>

const int LOOP_COUNT = 100000000;

int main() {
    int sum = 0;
    for (int i = 0; i < LOOP_COUNT; ++i) {
        sum += i % 10;
    }
    printf("%d\n", sum);
    return 0;
}
  • C编译时:LOOP_COUNT会被视为普通变量,循环边界需要从内存读取,编译器无法完全确定循环次数,优化空间有限。
  • C++编译时:LOOP_COUNT被识别为编译期常量,编译器可直接展开循环、进行常量折叠等优化,大幅提升执行效率。

存在性能显著下降的情况

典型场景是C++默认异常支持带来的额外开销:
多数C++编译器默认开启异常处理(如GCC的-fexceptions选项),即使代码中未显式使用异常,编译器也会生成用于栈展开的额外代码,增加函数调用和栈操作的开销;而C编译器无此类默认逻辑,生成的代码更精简。

示例代码:

#include <stdio.h>

int divide(int a, int b) {
    if (b == 0) {
        printf("Divide by zero\n");
        return 0;
    }
    return a / b;
}

int main() {
    int sum = 0;
    for (int i = 1; i < 10000000; ++i) {
        sum += divide(100, i);
    }
    printf("%d\n", sum);
    return 0;
}
  • C编译时:函数调用无额外异常处理代码,执行效率更高。
  • C++编译时:默认生成异常栈展开相关代码,函数调用的额外开销会在循环中被放大,导致整体性能下降(若关闭异常支持-fno-exceptions,性能可与C编译结果相当)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:17:48