如何解决为什么 STL 在 std::array 和 std::initializer_list 之间做了另一个区别
为什么不是只有一种性能最好的类型,在编译时定义一个列表?
基准很明确,constexpr std::initializer_list
更快,使用甚至更少的内存,并且 IO 读取比 constexpr std::array
少得惊人:
https://build-bench.com/b/1EDAcFjJ6NACk4Pg4tG2nbsEx0A
那么为什么他们不实现数组订阅方法来 std::initializer_list
使 std::array
变得不必要。
解决方法
这个问题暴露了对这里发生的事情的一些误解。
std::array
是一个数组对象。它是一个对象,其存储大小为其数组元素的存储空间。 std::initializer_list
是一个指向数组(由编译器创建的数组)的指针。例如,您可以堆分配 std::array
;你不能堆分配 std::initializer_list
。好吧,你可以,但你只会在堆上分配一个指针,这通常没有帮助。这:
auto *p = new std::initializer_list<int>{1,2,3,4};
是损坏的代码,因为它堆分配了一个指向由编译器创建的临时数组的指针。在此语句结束时立即销毁的临时数组。因此,您现在有一个指向不存在的数组的指针,因此使用 *p
或 p[x]
是未定义的行为。
对 std::array
做同样的事情效果很好,因为 array
是一个数组。
此外,std::initializer_list
的目的是不是“在编译时定义列表”。顾名思义,类型的目的是为了初始化一个对象而创建一个列表。这就是为什么除了特定的 C++ 语法(专门用于初始化对象:花括号初始化列表)之外的任何其他方式都无法提供其数据的最终来源。
您可以使用 std::initializer_list
作为一种快速而肮脏的方式,只是出于某种目的创建值数组。但这不是类型的重点。这就是为什么它没有 operator[]
;因为可以从一系列值初始化的函数往往不需要那个特定的操作。他们通常只需要从头到尾走一遍。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。