我正在实现一个容器类型,它拥有一些我使用
std::make_unique_for_overwrite()
创建的内存。鉴于此函数专门将 std::unique_ptr
返回到未初始化的内存,我想使用标准提供的未初始化的内存算法。当我尝试使用 constexpr
为我的容器编写测试时,我只注意到这些函数不是 static_assert
,只是意识到我的 constexpr
构造函数毕竟不是那么 constexpr
,因为我调用了 std::ranges::uninitialized_copy()
.
我的问题是,
std::ranges::copy()
和它未初始化的兄弟std::ranges::uninitialized_copy()
之间到底有什么区别,是否存在足够显着的性能差异来放弃constexpr
兼容性?
鉴于此函数专门将
返回到未初始化的内存std::unique_ptr
事实并非如此。它是一个
unique_ptr
到 default-initialized 对象(或数组或对象)。这并不是未初始化的:使用 uninitialized_*
算法将在现有对象上构造一个新对象,如果错过析构函数,可能会泄漏内存。
这些算法的“性能优势”在于,替代方案通常是默认构造,然后使用赋值运算符。这确实是一个“正确性”的好处,因为您不能期望泛型对象是默认可构造的,但作为副作用,您可以避免使用(可能成本高昂的)默认构造函数。
当您在“
constexpr
友好”算法和性能更高的算法之间有两种选择时,请使用 if consteval
并同时使用两者。