循环前面和循环内部的size()之间的差异



在操作次数、编译时间和良好实践方面,进行有什么不同吗

for(int i = 0; i < x.size(); i++)

而不是

int size = x.size();
for(int i = 0; i < size; i++)

如果没有编译优化,我会说后者更可取,因为它不是每次都调用函数堆栈,而是分配一次变量,然后访问它,而不是调用函数。

编译优化在下面处理这个问题吗?比方说,我想优化代码,使其在计算上尽可能经济;会有什么不同吗?

编译优化是否在下面处理此问题?

取决于。如果循环内容足够简单,那么它可能会处理它。否则,可能不会。

请注意,如果回路主体的大小发生变化,则回路不能互换。

编译优化是否在下面处理此问题?比方说,我想优化代码,使其在计算上尽可能经济;会有什么不同吗?

通常是的。编译器优化处理最佳方法。

在您的情况下,clang 13.1.6会产生相同的代码。我用一行for((创建了一个size1.cpp,用两行示例创建了size2.cpp

% cc -O3 -std=c++20 -o size1 size1.cpp -lc++ ; ./size1 ; cc -O3 -std=c++20 -S size1.cpp ; ls -l size1.s ; cc -O3 -std=c++20 -o size2 size2.cpp -lc++ ; ./size2 ; cc -O3 -std=c++20 -S size2.cpp ; ls -l size2.s ; diff size1.s size2.s
size1 180
-rw-r--r--  1 risner  staff  13298 Sep 15 07:55 size1.s
size2 180
-rw-r--r--  1 risner  staff  13298 Sep 15 07:55 size2.s
435c435
<   .asciz  "size1 "
---
>   .asciz  "size2 "

以下是文件:

// size1.cpp
#include <iostream>
#include <array>
int main() {
int a[8] = { 5, 10, 15, 20, 25, 30, 35, 40 };;
std::array<int, 8> x = std::to_array(a);
int z = 0;
for(int i = 0; i < x.size(); i++)
z += x[i];
std::cout<< "size1 " << z << "n";
}
// size2.cpp
#include <iostream>
#include <array>
int main() {
int a[8] = { 5, 10, 15, 20, 25, 30, 35, 40 };;
std::array<int, 8> x = std::to_array(a);
int z = 0, size = x.size();
for(int i = 0; i < size; i++)
z += x[i];;
std::cout<< "size2 " <<z << "n";
}

相关内容

  • 没有找到相关文章

最新更新