使用 c++ 的 std(::ranges)::uninitialized_... 算法是否有性能优势,是否值得不使用 constexpr?

问题描述 投票:0回答:1

我正在实现一个容器类型,它拥有一些我使用

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
兼容性?

c++ initialization constexpr std-ranges static-assert
1个回答
0
投票

鉴于此函数专门将

std::unique_ptr
返回到未初始化的内存

事实并非如此。它是一个

unique_ptr
default-initialized 对象(或数组或对象)。这并不是未初始化的:使用
uninitialized_*
算法将在现有对象上构造一个新对象,如果错过析构函数,可能会泄漏内存。


这些算法的“性能优势”在于,替代方案通常是默认构造,然后使用赋值运算符。这确实是一个“正确性”的好处,因为您不能期望泛型对象是默认可构造的,但作为副作用,您可以避免使用(可能成本高昂的)默认构造函数。


当您在“

constexpr
友好”算法和性能更高的算法之间有两种选择时,请使用
if consteval
并同时使用两者。

© www.soinside.com 2019 - 2024. All rights reserved.