【发布时间】:2021-01-10 11:25:40
【问题描述】:
我知道在编译时复制任意内存块并不总是可能的,但是既然我们得到了 constexpr 容器、虚拟方法和算法,为什么不使用 memcpy 呢?这也是一种算法。
此外,
- C++20
std::bit_cast看起来很像std::memcpyworkaroundreinterpret_cast但它是constexpr。 -
对于 C++20,使用迭代器的
std::copy被标记为constexpr,因此对于类型来说,复制是可能的。
用法是复制或只是“重新解释”constexpr 函数中的变量/数组,std::bit_cast AFAIK 无法解决前者。特别是question和我的回答想用它。
-
std::bit_cast可以是 constexpr 而std::memcpy不能是什么特殊原因? - 是否与使用 void 指针而不是类型化引用的 memcpy 有关?
- 实际上不必复制任何内容?
- C 向后兼容?
- 可能是因为不支持“指向 constexpr 内存的指针”?但同样适用于
std::bit_cast中的引用参数和std::copy中的迭代器。
C++20 bit_cast vs reinterpret_cast 的相关答案从某处简要引用:
此外,目前无法实现 constexpr 位转换函数,因为 memcpy 本身不是 constexpr。标记 提议的函数作为 constexpr 不需要或阻止 memcpy 成为 constexpr,但需要编译器支持。这离开 实现免费使用自己的内部解决方案(例如 LLVM 有 位广播操作码)。
但它并没有详细说明不使其成为 constexpr。
注意,我没有问为什么std::bit_cast 存在。我喜欢它,它提供了一个明确的意图,而不是 std::memcpy 解决方法。
【问题讨论】: