C++ fill_n vs.for循环初始化数组

C++ fill_n vs.for循环初始化数组,c++,optimization,std,C++,Optimization,Std,我想知道初始化时,fill\n和for循环之间的性能差异是什么 阵列 哪一个更好?刚刚测试了这三个代码(由GCC 4.7.2使用-O3优化编译): 我将这两行代码添加到所有代码中,因为我认为如果没有它们,GCC优化器将欺骗我 for (int i = 0; i < SIZE; i++) arr[i] = arr[i + 1 % SIZE]; 3.cpp 测量时间: mostafa@debian:~/Codes/tests/x$ time ./1 real 0m0.073s u

我想知道初始化时,
fill\n
和for循环之间的性能差异是什么 阵列


哪一个更好?

刚刚测试了这三个代码(由GCC 4.7.2使用
-O3
优化编译):

我将这两行代码添加到所有代码中,因为我认为如果没有它们,GCC优化器将欺骗我

for (int i = 0; i < SIZE; i++)
    arr[i] = arr[i + 1 % SIZE];
3.cpp 测量时间:

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

刚刚测试了这三个代码(由GCC 4.7.2通过
-O3
优化编译):

我将这两行代码添加到所有代码中,因为我认为如果没有它们,GCC优化器将欺骗我

for (int i = 0; i < SIZE; i++)
    arr[i] = arr[i + 1 % SIZE];
3.cpp 测量时间:

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

根据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;
}
模板
输出填充(输出优先、大小计数、常数和值)
{
用于(大小i=0;i

我相信这回答了你的问题P

根据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;
}
模板
输出填充(输出优先、大小计数、常数和值)
{
用于(大小i=0;i

我相信这回答了你的问题P

这些方法之间没有明显的性能差异。他们实现了同样的事情。而且代码的典型复杂程度足够低,几乎任何现代编译器都能意识到两者都做同样的事情并生成本质上相同的代码。

这些方法之间没有明显的性能差异。他们实现了同样的事情。而且代码的典型复杂程度足够低,几乎任何现代编译器都能意识到两者都做同样的事情并生成本质上相同的代码。

您自己试过测试吗?此外,尽可能对数组使用大括号初始化。为什么不知道什么时候可以测量?无论是
fill\n
还是
for
循环都不能用于初始化数组。对于这个愚蠢的问题,我很抱歉,我之所以问这个问题,是因为我使用的是windows,而且时间库的精度似乎可以达到纳秒,所以我说不出有什么区别。@Liang那么这应该可以回答你的问题了。即使使用最精确的计时器,也无法测量差异。那你他妈的为什么要关心它?无论如何它都无法测量。你自己试过测试吗?此外,尽可能对数组使用大括号初始化。为什么不知道什么时候可以测量?无论是
fill\n
还是
for
循环都不能用于初始化数组。对于这个愚蠢的问题,我很抱歉,我之所以问这个问题,是因为我使用的是windows,而且时间库的精度似乎可以达到纳秒,所以我说不出有什么区别。@Liang那么这应该可以回答你的问题了。即使使用最精确的计时器,也无法测量差异。那你他妈的为什么要关心它?无论如何,这是无法衡量的。这不是实现,而是一种可能的实现。这不是实现,而是一种可能的实现。@jogojapan这是
-O0
,谢谢你的帮助,我将编辑我的答案。我应该什么时候看这3个?jogojapan这是
-O0
,谢谢你们的帮助,我将编辑我的答案。我应该看哪一个时间,三个时间中的哪一个?