面试题答案
一键面试- 减少循环体内的计算量 在循环体内尽量避免执行重复且不必要的计算。例如:
// 未优化版本
for (int i = 0; i < n; ++i) {
double result = sin(i) * cos(i);
// 使用result进行其他操作
}
// 优化版本,提前计算常量
double factor = sin(1.0) * cos(1.0);
for (int i = 0; i < n; ++i) {
double result = factor * i;
// 使用result进行其他操作
}
- 缓存数组长度 如果在循环中频繁访问数组长度,将其缓存下来,避免每次循环都获取数组长度。例如:
// 未优化版本
std::vector<int> vec = {1, 2, 3, 4, 5};
for (size_t i = 0; i < vec.size(); ++i) {
// 循环体操作
}
// 优化版本
std::vector<int> vec = {1, 2, 3, 4, 5};
size_t length = vec.size();
for (size_t i = 0; i < length; ++i) {
// 循环体操作
}
- 使用合适的循环类型
根据具体需求选择
for
、while
或do - while
循环。一般for
循环更适合已知循环次数的场景,性能相对更好。例如:
// 使用for循环
for (int i = 0; i < 1000; ++i) {
// 循环体操作
}
// 用while循环实现相同功能,相对不够直观
int i = 0;
while (i < 1000) {
// 循环体操作
++i;
}
- 向量化
利用现代CPU的SIMD指令集对循环进行向量化。例如,使用
__m128
类型(SSE指令集)来同时处理多个数据:
#include <immintrin.h>
#include <iostream>
int main() {
float arr[4] = {1.0f, 2.0f, 3.0f, 4.0f};
__m128 vec = _mm_loadu_ps(arr);
__m128 result = _mm_add_ps(vec, vec);
_mm_storeu_ps(arr, result);
for (int i = 0; i < 4; ++i) {
std::cout << arr[i] << " ";
}
return 0;
}
- 展开循环 手动展开循环可以减少循环控制的开销。例如:
// 未展开版本
for (int i = 0; i < 8; ++i) {
a[i] = b[i] + c[i];
}
// 展开版本
a[0] = b[0] + c[0];
a[1] = b[1] + c[1];
a[2] = b[2] + c[2];
a[3] = b[3] + c[3];
a[4] = b[4] + c[4];
a[5] = b[5] + c[5];
a[6] = b[6] + c[6];
a[7] = b[7] + c[7];
现代编译器通常会自动进行循环展开优化,但手动展开有时可以进一步微调。