程序设计与优化:从函数内联到编译技巧
1. 函数内联
在 C++ 中,提供了内联构造(inline construct),它能让编译器为函数生成内联代码。当使用内联时,内联过程会尽可能以展开的形式生成。例如:
int foo(a,b,c) { return a1 b2c; }
Function definition
Function call
Inlining result
z5foo(w,x,y);
z5w 1x 2 y;
不过,内联并非总是最佳选择。虽然它能消除过程链接指令,但当存在缓存时,函数体的多个副本可能会减慢指令的获取速度。而且,内联会增加代码大小,而内存可能是宝贵的资源。
2. 循环变换
循环是程序中重要的结构,尽管在源代码中描述紧凑,但往往会占用大量的计算时间。以下是几种常见的循环优化技术:
- 循环展开(Loop Unrolling) :
- 示例代码:
// 原始循环
for (i = 0; i < N; i++) {
a[i] = b[i]*c[i];
}
// 当 N = 4 时的展开形式
a[0] = b[0]*c[0];
a[1] = b[1]*c[1];
a[2] = b[2]*c[2];
a[3] = b[3]*c[3];
展开后的代码没有循环开销代码,如迭代变量和测试。但它和内联过程有相同的问题,可能会干扰缓存并增加代码量。也可以部分展开,例
超级会员免费看
订阅专栏 解锁全文
2197

被折叠的 条评论
为什么被折叠?



