gsl assert 与 c++ 中的 assert 的优势?
Advantage of gsl assert vs assert in c++?
我知道 assert
在 C++ 中的用法。想知道在使用 gsl_assert
而不是 [=11] 之间有什么区别和任何好处(我认为 assert
根据 https://www.learncpp.com/cpp-tutorial/7-12a-assert-and-static_assert/ 中提到的那样成本更高,所以性能方面,两者是一样的吗?) =]?为什么在 gsl 库中添加了 gsl_assert
,因为在 c++ 中已经有 assert
支持(即使 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;
}
这不是性能问题;这是灵活性的问题。
C断言
如果条件为真,这将终止(在调试版本中),并且通常在发布版本中什么都不做。
GSL 合同检查
Depending on configuration,这可以:
- 抛出异常
- 终止
- 什么都不做
- …除了向优化器发出我们希望条件成立的信号(如果支持)
在某些配置模式下,我想 GSL 的 Expects
和 Ensures
宏最终会做与 assert
几乎相同的事情。但不是全部。
但值得注意的是,GSL 行为似乎不依赖于构建配置(调试与发布)。我想(我只是在猜测)对于 performance-critical 代码,明智的项目维护者会在调试版本中选择模式 #1 或 #2,在发布版本中选择模式 #3(或可能是 #2)。
我知道 assert
在 C++ 中的用法。想知道在使用 gsl_assert
而不是 [=11] 之间有什么区别和任何好处(我认为 assert
根据 https://www.learncpp.com/cpp-tutorial/7-12a-assert-and-static_assert/ 中提到的那样成本更高,所以性能方面,两者是一样的吗?) =]?为什么在 gsl 库中添加了 gsl_assert
,因为在 c++ 中已经有 assert
支持(即使 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;
}
这不是性能问题;这是灵活性的问题。
C断言
如果条件为真,这将终止(在调试版本中),并且通常在发布版本中什么都不做。
GSL 合同检查
Depending on configuration,这可以:
- 抛出异常
- 终止
- 什么都不做
- …除了向优化器发出我们希望条件成立的信号(如果支持)
在某些配置模式下,我想 GSL 的 Expects
和 Ensures
宏最终会做与 assert
几乎相同的事情。但不是全部。
但值得注意的是,GSL 行为似乎不依赖于构建配置(调试与发布)。我想(我只是在猜测)对于 performance-critical 代码,明智的项目维护者会在调试版本中选择模式 #1 或 #2,在发布版本中选择模式 #3(或可能是 #2)。