gpt4 book ai didi

c++ - GSL 的 Expects(cond) 对运行时的性能影响是什么?

转载 作者:行者123 更新时间:2023-11-28 01:24:31 26 4
gpt4 key购买 nike

CPP 核心指南建议使用Expects(expression) to state preconditionsEnsures(expression) to state postconditions来自 GSL在函数中。

例子:

int area(int height, int width)
{
Expects(height > 0 && width > 0); // good
if (height <= 0 || width <= 0) my_error(); // obscure
// ...
}

这些宏对性能有何影响?它就像用 if 检查条件然后抛出异常一样吗? Debug模式和非 Debug模式有区别吗?IE。如果应用程序是作为版本构建的,宏是否也处于事件状态?

我问是因为我正在考虑将其用作一种好的做法,即尝试,如果没有特定的理由反对它,只需说明可能的前置/后置条件(假设使用不同类型作为参数是不明智的)使用 GSL 中的这些宏。

最佳答案

这些宏在 gsl_assert 中定义 header 。

相关代码如下:

#define Expects(cond) GSL_CONTRACT_CHECK("Precondition", cond)

#if defined(GSL_THROW_ON_CONTRACT_VIOLATION)

#define GSL_CONTRACT_CHECK(type, cond) \
(GSL_LIKELY(cond) ? static_cast<void>(0) \
: gsl::details::throw_exception(gsl::fail_fast( \
"GSL: " type " failure at " __FILE__ ": " GSL_STRINGIFY(__LINE__))))

#elif defined(GSL_TERMINATE_ON_CONTRACT_VIOLATION)

#define GSL_CONTRACT_CHECK(type, cond) \
(GSL_LIKELY(cond) ? static_cast<void>(0) : gsl::details::terminate())

#elif defined(GSL_UNENFORCED_ON_CONTRACT_VIOLATION)

#define GSL_CONTRACT_CHECK(type, cond) GSL_ASSUME(cond)

#endif // GSL_THROW_ON_CONTRACT_VIOLATION

如您所见,这取决于您选择如何处理违约行为。在前两种情况下,您将支付分支成本以及抛出异常或调用 std::terminate

在定义了 GSL_UNENFORCED_ON_CONTRACT_VIOLATION 的情况下,宏将扩展为 GSL_ASSUME:

//
// GSL_ASSUME(cond)
//
// Tell the optimizer that the predicate cond must hold. It is unspecified
// whether or not cond is actually evaluated.
//
#ifdef _MSC_VER
#define GSL_ASSUME(cond) __assume(cond)
#elif defined(__GNUC__)
#define GSL_ASSUME(cond) ((cond) ? static_cast<void>(0) : __builtin_unreachable())
#else
#define GSL_ASSUME(cond) static_cast<void>((cond) ? 0 : 0)
#endif

在这种情况下,可能会或可能不会评估条件,具体取决于编译器。它还可以使您的代码更快,因为由于这些假设,编译器可能能够更积极地进行优化。

关于c++ - GSL 的 Expects(cond) 对运行时的性能影响是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54555347/

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