c++ - gsl assert 与 c++ 中的 assert 的优势?

标签 c++ guideline-support-library

我知道 assert 的用途在 C++ 中。想知道在使用 assert 之间有什么区别和任何好处(我认为 gsl_assert 根据 https://www.learncpp.com/cpp-tutorial/7-12a-assert-and-static_assert/ 中提到的成本更高,所以性能方面,两者是否相同?)在 assert ?为什么 gsl_assert已添加到 gsl 库中,因为已经存在 assert在 C++ 中支持(尽管 assert 来自“C”,因为我们添加了 #include<cassert> 以在 C++ 中使用 assert)?

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

int main()
{
    int val;
    cin >> val;
    Ensures( val > 5 );
    return 0;
}

最佳答案

这不是性能问题;这是灵 active 的问题。

C 断言

如果条件为真,这将终止(在调试版本中),并且通常在发布版本中什么都不做。

GSL契约(Contract)检查

Depending on configuration ,这可以:

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

在某些配置模式下,我想 GSL 的 ExpectsEnsures 宏最终会做与 assert 几乎相同的事情。但不是全部。

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

关于c++ - gsl assert 与 c++ 中的 assert 的优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56360796/

相关文章:

c# - 如果禁用 native 代码调试,调用外部函数时 vshost32-clr2.exe 会挂起

c++ - C++11 中的 lambda 表达式是什么?

c++ - gsl::span - 指向结束的指针

c++ - 如何获取 Chrome 当前版本的当前 URL

c++ - 如何在没有 MSYS 的情况下将 gtkmm 与 MinGW (g++) 一起使用?

c++ - 如何消除 'Only index into arrays using constant expressions' 警告?

c++ - 将 gsl::span 与 range-v3 一起使用

c++ - 如何使用 gsl::span 修复 No array to Pointer Decay 警告?

c++ - 以二进制文件打开文件与以文本文件打开文件之间的区别

c++ - 函数返回的 gsl::span 有错误的字节