在操作次数、编译时间和良好实践方面,进行有什么不同吗
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";
}