繁体   English   中英

boost :: scoped_array中&p [0]与p.get()的性能含义

[英]Performance implications of &p[0] vs. p.get() in boost::scoped_array

该主题概括地说了一切。 基本上在这样的情况下:

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

在执行&p[0]p.get()之间,性能是否有明显的不同?

我问是因为我喜欢第一个,它有一个更自然的指针,如语法。 实际上,它使它成为可能,因此您可以将p替换为本机指针或数组,而不必更改其他任何内容。

我猜因为get是一个衬里的“ return ptr; ”,所以编译器将内联该代码,并且我希望它足够聪明,可以内联operator[]以便不取消引用然后立即引用。 。

有人知道吗

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

但是,如果您拥有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。

好的,我已经按照Martin York的建议进行了一些基本测试。

似乎g ++(4.3.2)实际上对此非常好。 在-O2和-O3优化级别上,对于&p[0]p.get() ,它输出略有不同但在功能上等效的程序集。

如预期的那样,在-O处,它采用了最不复杂的路径,并向operator[]发出了调用。 需要注意的一件事是&p[0]版本的确使g ++发出了operator[]主体的副本,但是从未使用过它,因此,如果您从不使用operator[] ,则会有一点代码膨胀:

测试的代码是这样的(如果同时为0和1,则使用#if ):

#include <boost/scoped_array.hpp>
#include <cstdio>

int main() {
    boost::scoped_array<int> p(new int[10]);
#if 1
    printf("%p\n", &p[0]);
#else
    printf("%p\n", p.get());
#endif
}

这是您只是出于学术兴趣而问的问题,还是您正在编写的一些当前代码?

通常,人们建议代码清晰度比速度更重要,因此,除非您确定这会有所作为,否则您应该选择更清晰且与您的代码库匹配的任何一个选项。 FWIW,我个人认为get()更清晰。

暂无
暂无

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

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