9

我知道assert在 C++ 中的使用。想知道两者之间是否有任何区别和任何好处(我认为根据https://www.learncpp.com/cpp-tutorial/7-12a-assert-and-static_assert/assert中提到的成本更高,所以性能明智,两者都是一样吗?)在使用结束?为什么在 gsl 库中添加,因为在 c++ 中已经有支持(即使来自“C”,因为我们添加用于在 C++ 中使用)?gsl_assertassertgsl_assertassertassert#include<cassert>assert

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

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

1 回答 1

3

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

C 断言

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

GSL 合同检查

根据配置,这可以:

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

在某些配置模式下,我想 GSLExpectsEnsures宏最终会做与assert. 但不是全部。

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

于 2019-05-29T13:31:12.487 回答