提问人:Jason 提问时间:12/17/2012 最后编辑:jogojapanJason 更新时间:12/17/2012 访问量:1038
fill_n vs. for 循环初始化数组
fill_n vs. for-loop to initialize an array
答:
3赞
MostafaR
12/17/2012
#1
刚刚测试了这三个代码(由 GCC 4.7.2 编译并进行了优化):-O3
我把这两行添加到所有代码中,因为我认为没有它们,GCC 优化器会欺骗我。
for (int i = 0; i < SIZE; i++)
arr[i] = arr[i + 1 % SIZE];
1.cpp
#define SIZE (100*1000*1000)
char arr[SIZE];
int main()
{
for (int i = 0; i < SIZE; i++)
arr[SIZE] = 0;
for (int i = 0; i < SIZE; i++)
arr[i] = arr[i + 1 % SIZE];
}
2 个 .cpp
...
std::fill_n(arr, SIZE, 0);
...
3 个 .cpp
...
memset(arr, 0, SIZE);
...
测量次数:
mostafa@debian:~/Codes/tests/x$ time ./1
real 0m0.073s
user 0m0.008s
sys 0m0.064s
mostafa@debian:~/Codes/tests/x$ time ./2
real 0m0.080s
user 0m0.020s
sys 0m0.056s
mostafa@debian:~/Codes/tests/x$ time ./3
real 0m0.100s
user 0m0.056s
sys 0m0.044s
评论
1赞
MostafaR
12/17/2012
@jogojapan 是的,感谢您的帮助,我将编辑我的答案。-O0
1赞
Tobi Akinyemi
7/13/2020
我应该看 3 个时间中的哪个时间?
0赞
Kevin
12/17/2012
#2
根据 cppreference.com 实施:
template<class OutputIt, class Size, class T>
OutputIt fill_n(OutputIt first, Size count, const T& value)
{
for (Size i = 0; i < count; i++) {
*first++ = value;
}
return first;
}
我相信这回答了你的问题?:P
评论
7赞
jogojapan
12/17/2012
这不是实现,而是一种可能的实现。
3赞
AnT stands with Russia
12/17/2012
#3
这些方法之间没有有意义的性能差异。他们实现同样的事情。代码的典型复杂程度足够低,几乎任何现代编译器都无法意识到两者都做同样的事情并生成本质上相同的代码。
评论
fill_n
for