Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;性能:在循环中使用getter或先将其保存到变量_C++_Performance_Loops - Fatal编程技术网

C++ C++;性能:在循环中使用getter或先将其保存到变量

C++ C++;性能:在循环中使用getter或先将其保存到变量,c++,performance,loops,C++,Performance,Loops,我想知道在循环中使用getter一次又一次地获取相同的属性是否会影响性能。我应该先将其保存到变量中吗?请参见以下示例: 直接使用getter: for(int i=0; i<1000000; ++i) { print("Phone = %d\n", myobj->getCity("Foo")->getPhone(i); } for(inti=0;igetCity(“Foo”)->getPhone(i); } 编辑: 循环约束呢 for(int i=0; i<

我想知道在循环中使用getter一次又一次地获取相同的属性是否会影响性能。我应该先将其保存到变量中吗?请参见以下示例:

直接使用getter:

for(int i=0; i<1000000; ++i) {
  print("Phone = %d\n", myobj->getCity("Foo")->getPhone(i);
}
for(inti=0;igetCity(“Foo”)->getPhone(i);
}


编辑:

循环约束呢

for(int i=0; i<myobj->totalPhoneNum(); ++i) {...}
(int i=0;itotalPhoneNum();++i){…} 或

int totalPhoneNum=myobj->totalPhoneNum();

对于(int i=0;i是的,您应该这样做。无论它是否对性能有任何影响,它的语义都更清晰。通过先将其保存到变量,您可以指示它是循环不变量。

我建议您这样修改它,以检查NULL

City* city = myobj->getCity("Foo");
if(city != NULL)
{    
     for(int i=0; i<1000000; ++i) 
     {
       print("Phone = %d\n", city ->getPhone(i);
     }
}
City*City=myobj->getCity(“Foo”);
如果(城市!=NULL)
{    
用于(int i=0;igetPhone(i);
}
}

除非您在两个地方没有执行myobj->totalPhoneNum(),否则可以通过这种方式调用

只有当getter的参数依赖于某个循环变量时,才应该在循环中使用getter。在您的情况下,它是“常量”因此,您应该将其保存到一个变量中。它将更可读。刚刚更新了我的问题,循环约束如何?我认为一行更可读、更清晰,但totalPhoneNum在这里是一个常量。哪一行更可取?以防您错过我对(现在已删除)的评论答案是,编译器无法优化它,除非它能够证明
totalPhoneNum()
是常量且没有副作用。如果该函数甚至有点不平凡,您可能最好手动将其拉出。我认为在第二种情况下,myobj->totalPhoneNum()可以使用,因为它只返回一个常量。@user396672是的,也是这样!这也是我几乎总是喜欢手动执行的原因之一。有太多的死角情况会阻止编译器为您执行此操作。假设它实际上是一个循环不变量,并且在循环过程中无法更改。@Jeff,第二个呢我的问题中的大小写?听起来两种方法没有太大的区别(?)。相同的参数适用。您不希望每次在循环中计算
myobj->totalPhoneNum()
,因为它是一个循环不变量。将它拉到一个变量中会更清楚。
City* city = myobj->getCity("Foo");
if(city != NULL)
{    
     for(int i=0; i<1000000; ++i) 
     {
       print("Phone = %d\n", city ->getPhone(i);
     }
}