C++20 P0784R7 Non-transient allocation too brittle vs. P1004R2 constexpr std::vector(C++20 P0784R7非瞬时分配太脆弱vs.P1004R2常量表达式std::VECTOR)
问题描述
我想在C++20中创建一个广泛的constexpr
数据存储库。数以万计的本机C++对象作为&q;文本段&即请求分页加载到进程中并在实例之间共享(生成代码)。
对象相互引用,需要通过各种属性、交叉引用等进行索引,所有这些都希望在编译时完成。这需要constexpr
(关联)容器,但不能使用模板化(按大小、散列大小等)完成。容器,因为一切都需要保持多态。
首先这似乎是不可能的,因为C++20P0784R7认为非瞬时分配太脆弱,即动态分配的内存不允许从constexpr
计算中泄漏出来。
同时C++20P1004R2表示要支持constexpr std::vector
。在后一篇文章中,我看到了所有成员,包括标记为constexpr
的修改成员。因此,除非我遗漏了什么,否则我可以在constexpr
计算中向std::vectors
添加元素(编译器还不支持它,所以我不能尝试)。
// 21.3.11.5, modifiers
template<class... Args> constexpr reference emplace_back(Args&&... args);
constexpr void push_back(const T& x);
constexpr void push_back(T&& x);
...
但是,为什么我不能围绕std::vector<T>
构建一个allocator<T>
,并且仍然具有非瞬时分配?constexpr std::vector
这两个能力在计算上是否等价,是否需要实现非暂态分配,因此也可以提供?
编译器最终何时支持它? ..。或者,这一可疑的矛盾甚至是推迟的原因?
推荐答案
您对临时分配有误解。临时分配是指在常量计算内完全存在的分配。例如:
constexpr std::size_t summation(std::vector<unsigned int> const &vi)
{
std::size_t ret = 0;
for(auto i : vi)
ret += i;
return ret;
}
constexpr auto sum = summation({20, 44, 98});
在summation
调用中,最终的输入源(带括号的init-list及其值)在编译时是完全已知的。是的,有一个vector
,但它完全存在于常量表达式计算中。vector
对象用于计算常量值,但vector
本身从不留下常量表达式代码。
这篇关于C++20 P0784R7非瞬时分配太脆弱vs.P1004R2常量表达式std::VECTOR的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:C++20 P0784R7非瞬时分配太脆弱vs.P1004R2常量表达式std::VECTOR


- OpenGL 对象的 RAII 包装器 2021-01-01
- 将函数的返回值分配给引用 C++? 2022-01-01
- GDB 不显示函数名 2022-01-01
- 哪个更快:if (bool) 或 if(int)? 2022-01-01
- 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值 2021-01-01
- 使用 __stdcall & 调用 DLLVS2013 中的 GetProcAddress() 2021-01-01
- 如何提取 __VA_ARGS__? 2022-01-01
- 将 hdc 内容复制到位图 2022-09-04
- DoEvents 等效于 C++? 2021-01-01
- XML Schema 到 C++ 类 2022-01-01