静态常量 std::<char>没有堆的向量初始化?

static const std::vector<char> initialization without heap?

本文关键字:向量 初始化 char std 常量 lt 静态 gt      更新时间:2023-10-16

假设我想要一个无符号字符的 std::vector。它使用初始值设定项列表(这是 C++11(进行初始化,并且永远不会更改。我想避免任何堆分配,即使在启动时,并且像 const 字符串一样将整个向量存在于数据段中。这可能吗?即: static const vector<char> v{0x1, 0x2, 0x3, 0x0, 0x5}; (这是一个有点学术性的问题;我知道只使用 C 数组并不难。

为什么不为此使用std::array呢?

static const std::array<char, 5> v{0x1, 0x2, 0x3, 0x0, 0x5};

这避免了任何动态分配,因为std::array使用最有可能声明为 T arr[N] 的内部数组,其中 N 是您在模板中传递的大小(此处为 5(。

当您在这里时,您甚至可能想 变量constexpr ,正如@MSalters指出的那样,"这为编译器提供了更多消除v存储的机会。

如果固定大小的std::array或内置数组不合适,则可以定义使用放置 new 的自定义分配器。

这需要编写很多样板文件,所以如果你可以使用 Boost,boost::container::static_vector正是你要找的。

OP进一步问:

我希望 std::array 有一个重载,它从initializer_list中获取大小

您的愿望由 C++17 扣除指南实现:

std::array v {'x1','x2','x3','x0','x5'};
static_assert(std::is_same_v<decltype(v), std::array<char,5>>);

自 7.1.0 起g++ -std=c++17(Clang似乎还没有接受这一点(。

cpp首选项链接:std::数组的演绎指南,类模板参数推导

请注意,init-list 现在必须包含所有char值才能推断数组的值类型。类推演是全部或没有 - 你不能声明array<char>而只是推导大小。