-4

Why is there not only 1 type with the best performance, to define a list at compile time?

The benchmark is clear, the constexpr std::initializer_list is faster, uses even less memory and the IO-reads are astonishingly less over constexpr std::array:

https://build-bench.com/b/1EDAcFjJ6NACk4Pg4tG2nbsEx0A

So why didn't they implement the array subscription methods to std::initializer_list make std::array unnecessary.

4

1 回答 1

1

这个问题暴露了对这里发生的事情的一些误解。

std::array是一个数组对象。它是一个对象,其存储大小是其数组元素的存储空间。std::initializer_list指向数组的指针(由编译器创建)。例如,您可以堆分配std::array;你不能堆分配std::initializer_list。好吧,你可以,但你只是在堆分配一个指针,这通常没有帮助。这个:

auto *p = new std::initializer_list<int>{1, 2, 3, 4};

是损坏的代码,因为它堆分配指向由编译器创建的临时数组的指针。在此语句结束时立即销毁的临时数组。所以你现在有一个指向一个不存在的数组的指针,所以使用*porp[x]是未定义的行为。

做同样的std::array工作很好,因为array 是一个数组

此外, 的目的std::initializer_list不是“在编译时定义列表” 顾名思义,该类型的重点是创建一个用于初始化对象的列表。这就是为什么它的数据的最终来源只能通过特定的 C++ 语法片段提供,一种专门用于初始化对象的方法:一个花括号初始化列表。

您可以将std::initializer_list其用作一种快速而肮脏的方式,仅为某种目的创建一个值数组。但这不是类型的重点。这就是为什么它没有operator[]; 因为可以从一系列值初始化的函数往往不需要该特定操作。他们通常只需要从头到尾走一遍。

于 2021-02-18T17:16:15.797 回答