gpt4 book ai didi

C++ 异常、GCC 和 "inline-functions"标志

转载 作者:行者123 更新时间:2023-11-28 08:24:49 24 4
gpt4 key购买 nike

我正在阅读有关 C++ 异常处理的文章。我找到了这个 topic在 StackOverflow 上。有一些简单的测试,我稍微修改了一下:

C 代码:

#include <stdio.h>
#include <time.h>

#define BIG 10000000000

long f( long n ) {
long r = 0, i = 0;
for ( i = 0; i < 1000; i++ ) {
r += i;
if ( n == BIG - 1 ) {
return -1;
}
}
return r;
}

int main() {
long i = 0, z = 0;
for ( i = 0; i < BIG; i++ ) {
if ( (z = f(i)) == -1 ) {
break;
}
}
}

C++代码:

#include <stdio.h>
#include <time.h>

#define BIG 10000000000

long f( long n ) {
long r = 0, i = 0;
for ( i = 0; i < 1000; i++ ) {
r += i;
if ( n == BIG - 1 ) {
throw -1;
}
}
return r;
}

int main() {
long i = 0, z = 0;
for ( i = 0; i < BIG; i++ ) {
try {
z += f(i);
}
catch(int tmp) {
break;
}

}
}

我用 -O2 优化选项编译了两者,结果 C 程序要快得多:

gcc -O2 kod.c -o prog_c
time ./prog_c

real 0m8.610s
user 0m8.520s
sys 0m0.010s

g++ -O2 kod.cpp -o prog_cpp
time ./prog_cpp

real 0m25.460s
user 0m25.260s
sys 0m0.020s

size prog_cpp
text data bss dec hex filename
2019 592 32 2643 a53 prog_cpp

g++ -O2 kod.cpp -o prog_cpp -finline-functions
time ./prog_cpp

real 0m8.412s
user 0m8.390s
sys 0m0.000s

size prog_cpp
text data bss dec hex filename
2019 592 32 2643 a53 prog_cpp

输出的可执行文件大小完全相同,但使用 -finline-functions 程序编译时要快得多。我试图调查汇编程序输出,

因为 -finline-functions 仅在第三级 GCC 优化中启用,所以它在某种程度上是危险的,所以请告诉我为什么我不应该在生产代码中使用?

我在 Intel Core 2 Duo(64 位模式)上使用 GCC v4.5.2。

最佳答案

这些程序并不等同。在 C 版本中,你返回你的哨兵,但在 C++ 中,你抛出它。异常不一定返回给调用者,因此一些额外的机制被放置在调用点和被调用函数中以安排展开堆栈。 C 中最接近 C++ 异常的是 longjmp

当编译器决定执行内联优化时,调用者和被调用者都是已知的,并且可以将异常解析为更便宜的分支。

两者都是“安全的”,但不包含异常的代码比使用异常的代码更小、更快是很正常的。

关于C++ 异常、GCC 和 "inline-functions"标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4413123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com