假设我想要一个未签名字符的std :: vector。它是用初始化列表(这是C ++ 11)初始化的,永远不会改变。我想避免任何堆分配,即使在启动时,也要让整个向量像const字符串一样存在于数据段中。那可能吗?即:
static const vector<char> v{0x1, 0x2, 0x3, 0x0, 0x5};
(这是一个有点学术性的问题;我知道为此只使用C数组并不难。)
答案 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
就是你正在寻找的。 p>
答案 2 :(得分:3)
我希望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::array,Class template argument deduction
请注意,init-list现在必须包含所有char
值才能推导出数组的值类型。类别扣除是全部或全部 - 您不能声明array<char>
并且只是推断出大小。