繁体   English   中英

条件循环:变量与函数?

[英]Conditional loop: variable vs function?

是否有任何值得选择的理由,例如性能或安全性?

std::vector<std::string> some_vec{ "a","b","c"};

std::vector<std::string>::const_iterator iter = some_vec.begin();
std::vector<std::string>::const_iterator end = some_vec.end();

while( iter++ != end ){Do}

--

std::vector<std::string> some_vec{ "a","b","c"};

std::vector<std::string>::const_iterator iter = some_vec.begin();

while( iter++ != some_vec.end() ){Do}

第一个依赖于循环过程中end不会失效:

// some_vec initialised with data!
std::vector<std::string> some_vec; 

std::vector<std::string>::const_iterator iter = some_vec.begin();
//std::vector<std::string>::const_iterator end = some_vec.end();

while( iter++ != some_vec.end() ){
    if (p(*iter)) iter = some_vec.insert(iter, "foo");
}

insert可能会使所有迭代器无效,因此不能将end用于比较。

为了提高效率,我不会太担心。 如果some_vec.end()总是返回相同的迭代器,则希望编译器意识到这一点并执行适当的优化。

首先, while( iter++ != end ){Do}是错误的。 您最终将在循环主体中具有结束迭代器。 解决此问题后,我们可以使用quick-bench.com来查看是否存在性能差异:

#include <vector>

static void test0(benchmark::State& state)
{
    std::vector<std::string> some_vec{ "a", "b", "c" };

    for (auto _ : state)
    {
        auto iter = some_vec.cbegin();
        auto end = some_vec.cend();
        while (iter != end)
        {
            auto ch = (*iter++)[0];
            benchmark::DoNotOptimize(ch);
        }
    }
    benchmark::DoNotOptimize(some_vec);
}
// Register the function as a benchmark
BENCHMARK(test0);

static void test1(benchmark::State& state)
{
    // Code before the loop is not measured
    std::vector<std::string> some_vec{ "a", "b", "c" };
    for (auto _ : state)
    {
        auto iter = some_vec.cbegin();
        while (iter != some_vec.cend())
        {
            auto ch = (*iter++)[0];
            benchmark::DoNotOptimize(ch);
        }
    }
    benchmark::DoNotOptimize(some_vec);
}
BENCHMARK(test1);

没有优化和gcc 8.2, test0快1.3倍:

没有优化结果gcc

O3优化级别下, test0快1.1倍:

O3-gcc

使用Clang 7,它们几乎相同:

O3-C

因此,性能似乎不是问题,但是如果最终插入者可以以某种方式失效,则第二个版本更安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM