这个话题通常都说明了一切。基本上是在这种情况下:
boost::scoped_array<int> p(new int[10]);
在执行:&p[0]
和p.get()
之间的效果是否存在明显差异?
我问,因为我更喜欢第一个,它有一个更自然的指针,如语法。事实上,它使得你可以用本机指针或数组替换p,而不必改变任何其他东西。
我猜是因为get是一个单行“return ptr;
”,编译器会将其内联,并且我希望以足够聪明的方式内联operator[]
以便它能够不要取消引用然后立即引用。
有人知道吗?
答案 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()更清晰。