gsl assert相对于c++中的assert有什么优势?

10

我知道在C++中使用assert的方法。想知道使用gsl_assertassert有什么区别和好处(根据https://www.learncpp.com/cpp-tutorial/7-12a-assert-and-static_assert/所述,我认为assert是更费时的,那么性能方面,这两者是否相同?)为什么在gsl库中添加了gsl_assert,既然C++中已经支持assert(即使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;
}

3
请查看这个问题。 - user1143634
我明白了,谢谢分享 :) - suresh m
但我想了解两者的性能比较,因为如上链接(learncpp)所述,assert通常不用于生产构建。 - suresh m
1个回答

3

这不是性能问题,而是灵活性问题。

C语言中的assert

在调试版本中,如果条件为真,它将终止程序;在发布版本中通常不执行任何操作。

GSL契约检查

根据配置的不同,该操作可能会有以下几种情况:

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

在某些配置模式下,我认为 GSL 的 ExpectsEnsures 宏实际上与 assert 做了类似的事情。但并非总是如此。

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


2
根据核心指南的作者的决定,最近MS GSL已删除了GSL_THROW_ON_CONTRACT_VIOLATION,现在总是采用std::terminate。但是...仍然有一个讨论正在进行,因为核心指南对于Expects的行为似乎是不一致的。 - Werner Henze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接