c - 考虑到循环内的变量定义,循环内嵌套函数的性能如何?
问题描述
我有一个关于性能的问题,特别是当我们在循环中有一些嵌套的函数调用以及在最深的函数调用中有许多变量定义时它看起来如何受到影响。例如,假设我们有以下内容:
void fun2(){
for(int i = 0 i<FINITE_NUMBER; i++){
int a = 5*i;
int b = 6*i;
.
.
//A HUGE LIST
.
.
int zz = N*i;
/* some operations with a,b,..z */
//also, BESIDES THE SCOPE, what difference in performance would it make to declare a,b,...,zz outside of the for-loop?
}
}
void fun1(){
fun2();
}
int main(){
for(;;){
fun1();
}
}
我的理解是,每次 fun1() 完成时, fun2() 中所有已初始化变量的范围都将被销毁,因为必须在下一个循环周期中再次初始化它们。那么,去掉函数嵌套会更好吗?**请在 fun2() 定义中的评论中注明我的问题。
另外,编译器优化 -Os 会注意到这一点吗?
提前致谢,如果我的问题不够清楚,请告诉我!
解决方案
几乎所有编译器都能够优化代码(gcc、icc、clang)——循环内部/外部的声明位置不会产生影响。最好保持代码的逻辑性和组织性,并尽量保持声明和初始化接近。
可能有助于编译器的事情是
const
(关于变量)和restrict
(关于指针)。- 块作用域变量,指示值不必在代码段之间保持不变。
它们为编译器提供了额外的信息和重新排列代码的灵活性。
推荐阅读
- javascript - 合并 JSON 对象
- php - 自定义php函数下拉列表不起作用
- java - @Keep 方法是否会被混淆
- python - How to implement "Your file is being prepared. Please wait 1 minute." that auto-updates when the file is ready with Python Bottle?
- c# - ServiceStack: Showing both auth and authenticate paths
- r - 在 Centos 中为 Amazon EC2 安排 R Cron
- git - 带有并发更改的 Git pull --mirror
- powershell - Powershell running command after script
- function - Azure Functions v2 引发异常 System.AccessViolationException
- java - Vertx - InfluxDB metrics keeping connection open