GSL断言与C ++中的断言的优势?

sur*_*h m 9 c++ guideline-support-library

我知道assertC ++中的用法。想知道有没有之间任何利益差别(我认为assert根据昂贵,如提到的https://www.learncpp.com/cpp-tutorial/7-12a-assert-and-static_assert/明智这样的表现,都同样吗?)在使用gsl_assertover assert吗?为什么要gsl_assert在gsl库中添加代码,因为assertc ++ 已经提供了支持(即使assert来自“ C”,因为我们添加#include<cassert>assert在C ++中的使用)?

#include <iostream>
#include <gsl/gsl_assert>
using namespace std;

int main()
{
    int val;
    cin >> val;
    Ensures( val > 5 );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 3

这不是性能问题;而是性能问题。这是一个灵活性问题。

C 断言

如果条件为真,这只会终止(在调试版本中),并且通常在发布版本中不执行任何操作。

GSL合同检查

根据配置,这可以:

  1. 抛出异常
  2. 终止
  3. 没做什么
    • …除了向优化器发出我们期望条件成立的信号(如果支持)

在某些配置模式下,我认为 GSLExpectsEnsures宏最终会做与assert. 但并非全部。

但值得注意的是,GSL 行为似乎并不依赖于构建配置(调试与发布)。我猜(我只是猜测),对于性能关键的代码,明智的项目维护者会在调试版本中选择模式#1或#2,在发布版本中选择#3(或可能#2)。

  • 根据核心指南作者的决定,MS GSL 最近删除了“GSL_THROW_ON_CONTRACT_VIOLATION”,现在始终删除“std::terminate”。但是......仍然有一个讨论正在进行,因为核心指南似乎对于“期望”的行为不一致。 (2认同)