在std::array上使用std::get是否能提高性能?

3
标准库类模板 std::array<T, N> 具有成员访问函数。
constexpr const T& operator[]( size_type n ) const;

还有一个非成员访问器函数模板

template< size_t I, class T, size_t N >
constexpr const T& get( const array<T,N>& a ) noexcept

在C++17中,所有operator[]的重载都已经被设置为constexpr,那么我想知道std::get是否还有任何优势。例如,在像下面这样的程序中:
int main()
{
    auto a = std::array<int, 3> { 1, 2, 3 };
    constexpr auto idx = 0;
    std::cout << a[idx] << '\n';
    std::cout << std::get<idx>(a) << '\n';
}

任何一个良好的编译器都应该能够为 operator[]get 传播常量索引值0。问题是:使用 std::arraystd::get 相比于 operator[] 有哪些好处呢?

3
一个好处是它使得可以在许多期望 std::tuple 的地方使用 std::array - Justin
2
就性能而言,在我所知道的范围内,不应该有任何差异; 假设您的编译器优化器完成其工作。 - Jesper Juhl
2个回答

10

使用结构化绑定时需要使用Get。

其他通用元组代码也会使用它。


啊,结构化绑定是个不错的点。但由于 get 只是将编译时常量委托给 op[],在其他情况下应该没有性能差异,对吗? - TemplateRex
2
@TemplateRex 在 godbolt 上玩一下,你就会知道。 - Passer By

3

问题:使用std::array中的std::get相较于operator[]有哪些优点?

除了提供与tuple相同的通用接口外,显然,我们在C ++中隐式地定义产品类型时,std::get还具有更多优势。它可以在编译时进行边界检查:

std::array<int, 3> arr;
arr[4] = 17;           // bad
std::get<5>(arr) = 42; // bad, but also compile error, so actually good

这是因为如果索引越界,元组接口会明确地不合法(参见[array.tuple]),但operator[]只是一个运行时问题,需要跟踪解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接