& p [0]与p ::get()在boost :: scoped_array中的性能影响

时间:2008-11-07 22:39:46

标签: c++ performance boost

这个话题通常都说明了一切。基本上是在这种情况下:

boost::scoped_array<int> p(new int[10]);

在执行:&p[0]p.get()之间的效果是否存在明显差异?

我问,因为我更喜欢第一个,它有一个更自然的指针,如语法。事实上,它使得你可以用本机指针或数组替换p,而不必改变任何其他东西。

我猜是因为get是一个单行“return ptr;”,编译器会将其内联,并且我希望以足够聪明的方式内联operator[]以便它能够不要取消引用然后立即引用。

有人知道吗?

3 个答案:

答案 0 :(得分:2)

要知道的唯一方法就是实际测量它!

但是如果你有boost:scoped_array的源代码,那么你可以看一下代码,看看它的作用。我相信它非常相似。

T * scoped_array::get() const // never throws
{
    return ptr;
}

T & scoped_array::operator[](std::ptrdiff_t i) const // never throws
{
    BOOST_ASSERT(ptr != 0);
    BOOST_ASSERT(i >= 0);
    return ptr[i];
}

编写两个版本的代码(一个使用get()另一个使用operator [])。在打开优化的情况下编译为汇编。看看你的编译器是否真的设法优化了ptr + 0。

答案 1 :(得分:1)

好的,我按照Martin York的建议做了一些基本测试。

似乎g ++(4.3.2)实际上相当不错。在-O2和-O3优化级别,它为&p[0]p.get()输出略有不同但功能相同的程序集。

At -Os如预期的那样,它采用了最不复杂的路径,并向operator[]发出呼叫。需要注意的一点是,&p[0]版本确实会导致g ++发出operator[]正文的副本,但它永远不会被使用,所以如果你从不使用{{1}那么会有轻微的代码膨胀否则:

测试的代码是这样的(operator[]都是0和1):

#if

答案 2 :(得分:0)

这是一个问题,你只是为了学术兴趣,或者这是你正在编写的一些当前代码吗?

一般来说,人们建议代码清晰度对速度更重要,因此除非您确定这会产生影响,否则您应该选择更清晰且与您的代码库相匹配的选项。 FWIW,我个人认为get()更清晰。