gpt4 book ai didi

c++ - 为什么 gsl::not_null 确保 ptr 在 get() 上不为空?

转载 作者:太空狗 更新时间:2023-10-29 21:33:24 26 4
gpt4 key购买 nike

在微软implementation指南支持库我看到以下代码:

template<class T>
class not_null {
...
template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>>
constexpr explicit not_null(U&& u) : ptr_(std::forward<U>(u)) {
Expects(ptr_ != nullptr);
}
...
constexpr T get() const {
Ensures(ptr_);
return ptr_;
}
...
T ptr_;
}

gsl::not_null 的所有可能采用指针的构造函数都会检查这些指针是否为空,但我们仍然检查指针 (ptr_) 的存储值是否为空每个 解引用。鉴于在 C++ 中我们通常不会为我们不需要的东西付费,为什么我们要进行此检查?

UP:确保实现如下(使用默认标志):

#define GSL_LIKELY(x) (!!(x))
...
#define GSL_CONTRACT_CHECK(type, cond) \
(GSL_LIKELY(cond) ? static_cast<void>(0) : gsl::details::terminate())
...
#define Ensures(cond) GSL_CONTRACT_CHECK("Postcondition", cond)

最佳答案

评论已经给出了为什么要从 not_null::get() 中删除空检查的想法是不可取的。主要问题是更改允许在移动后取消引用智能指针。

例如,请参阅以下关于支持使用 not_null<unique_ptr> 的 PR 的讨论以及更改如何与从 not_null::get() 中删除空检查不兼容

https://github.com/Microsoft/GSL/pull/675

至于性能问题,编译器优化器应该能够删除许多空检查,当然不是全部。如果某些检查没有被删除但看起来可以删除,我们应该修复编译器优化。

关于c++ - 为什么 gsl::not_null 确保 ptr 在 get() 上不为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51157916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com