【问题标题】:Advantage of gsl assert vs assert in c++?c++ 中 gsl 断言与断言的优势?
【发布时间】:2019-05-29 12:35:17
【问题描述】:

我知道在 C++ 中使用 assert。想知道在使用gsl_assert 而不是assert 之间是否有任何区别和任何好处(我认为assert 的成本更高,如https://www.learncpp.com/cpp-tutorial/7-12a-assert-and-static_assert/ 中提到的那样,性能明智,两者都相同吗?)?为什么gsl_assert被添加到gsl库中,因为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;
}

【问题讨论】:

标签: c++ guideline-support-library


【解决方案1】:

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

C 断言

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

GSL 合同检查

Depending on configuration,这个可以:

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

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

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

【讨论】:

  • 根据核心指南作者的决定,MS GSL 最近删除了GSL_THROW_ON_CONTRACT_VIOLATION,现在总是删除std::terminates。但是......仍在进行讨论,因为核心准则似乎与 Expects 的行为不一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 2019-02-19
  • 2017-04-04
  • 1970-01-01
  • 2022-07-23
  • 2022-10-24
相关资源
最近更新 更多