静态常量 std::<char>没有堆的向量初始化?
static const std::vector<char> initialization without heap?
假设我想要一个无符号字符的 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>
而只是推导大小。
相关文章:
- 为什么我在向量初始化时收到此错误?
- 使用向量初始化参数化构造函数的对象数组
- C++向量初始化遗传算法的代理向量
- shared_ptr类的向量的向量初始化问题
- 如何实现使用 gcc-4.4 编译的大向量初始化?
- 使用向量初始化C++中的链表
- C++ 中的向量初始化
- 如何使用嵌套初始化构造函数中的一维向量初始化矩阵
- std::另一个函数中的向量初始化
- 理解向量初始化时出现问题
- 静态常量 std::<char>没有堆的向量初始化?
- 向量初始化在 C++ 类中失败
- 具有从特定范围的随机数初始化特征矩阵或向量初始化特征矩阵或向量的有效方法
- 关于向量初始化的一些问题
- 了解C 中的向量初始化
- 设置::使用数字中的引号进行向量初始化
- VS2010中的向量初始化
- C++:构造函数中的向量初始化
- 如何从向量初始化数组?(如何将指针强制转换为数组?)
- 给我一个向量初始化的提示或(答案)