C++;例外情况、通用条款和;“内联函数”;旗帜 我正在阅读C++中关于异常处理的文章。我在StackOverflow上找到了这个。有一些简单的测试,我做了一些修改:
C代码:C++;例外情况、通用条款和;“内联函数”;旗帜 我正在阅读C++中关于异常处理的文章。我在StackOverflow上找到了这个。有一些简单的测试,我做了一些修改:,c++,optimization,gcc,exception-handling,C++,Optimization,Gcc,Exception Handling,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; } }
#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;
}
}
}
输出的可执行文件大小完全相同,但使用-finline函数编译时,程序速度要快得多。我试图调查汇编程序的输出 因为-finline函数只在第三级GCC优化中启用,所以不知何故它是危险的,所以请告诉我为什么我不应该在生产代码中使用
我在Intel Core 2 Duo(64位模式)上使用GCC v4.5.2。这些程序并不等效。在C版本中,你返回你的哨兵,但是在C++中,你扔它。异常不一定返回给调用方,因此在调用站点和被调用函数中都放置了一些额外的机制来安排展开堆栈。C到C++异常中最接近的是一个<代码> LojJMP < /C>。p> 当编译器决定执行内联优化时,调用者和被调用者都是已知的,异常可以解析为更便宜的分支
两者都是“安全的”,但不包含异常的代码比使用异常的代码小一点、快一点是很正常的 为什么你认为
-finline函数
是危险的?gcc应该在所有优化级别工作;当你使用-O3时,它不应该变差。所以,一直使用-O3
我做了一些非常错误的事情?@Charles:我知道Linux内核开发人员不喜欢gcc的严格别名优化,但它会在-O2打开。是的,我知道,这些程序并不相等(我发现了它们)。我只是好奇,在使用和不使用这个优化标志构建的可执行文件之间,运行时有这么大的差异。我又调查了一次汇编程序的输出,发现哪个部分是内联的。另一方面,我不知道,直接函数调用在x86上非常昂贵。。。
#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;
}
}
}
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