static const std :: vector <char>初始化没有堆?

时间:2018-01-31 22:44:09

标签: c++ c++11 vector

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

3 个答案:

答案 0 :(得分:13)

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

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

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

当你在这里时,你甚至可能想要变量constexpr,正如@MSalters指出的那样,“给编译器提供了更多机会来消除v的存储空间”。

答案 1 :(得分:4)

如果固定大小的std::array或内置数组不合适,您可以define a custom allocator使用placement new

这是很多要编写的样板,所以如果你可以使用Boost,那么boost::container::static_vector就是你正在寻找的。

答案 2 :(得分:3)

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似乎还没有接受这个)。

cppreference链接:Deduction guides for std::arrayClass template argument deduction

请注意,init-list现在必须包含所有char值才能推导出数组的值类型。类别扣除是全部或全部 - 您不能声明array<char>并且只是推断出大小。