求符合标准的C代码以C++编译后性能显著变化的实例
符合C11与C++标准的代码在两种编译环境下的性能差异问题
前置说明
- 注:该问题可能已有人提出
- 更新记录:
- 更新1:补充关注性能提升的情况
- 更新2:参考相关问题:同时符合C和C++标准的代码在两种语言编译下行为是否不同?
- 更新3:明确讨论范围:仅关注**严格符合C11标准(C11, 4p5)**的C代码,且该代码同时是无未定义行为(UB)、未指定行为(UnspecB)、实现定义行为(IB)的良构C++程序,需满足:
- 无N4917标准中第5至33条款及附录D的规则违反
- 具备相同的抽象语义
核心问题
是否存在这样的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
相关产品推荐
相关产品推荐

