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
基础教程推荐
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++,'if' 表达式中的变量声明 2021-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 设计字符串本地化的最佳方法 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01