Преимущество gsl assert против assert в c ++? - PullRequest
9 голосов
/ 29 мая 2019

Я знаю использование assert в C ++. Хотелось бы узнать, есть ли какая-либо разница между какой-либо выгодой (я думаю, что assert стоит дороже в соответствии с тем, как указано в https://www.learncpp.com/cpp-tutorial/7-12a-assert-and-static_assert/, поэтому с точки зрения производительности оба одинаковы?) При использовании gsl_assert над assert? Почему gsl_assert был добавлен в библиотеку gsl, поскольку в 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;
}

1 Ответ

2 голосов
/ 29 мая 2019

Это не вопрос производительности;это вопрос гибкости.

C assert

Это просто завершается (в отладочных сборках), если условие выполняется, и обычно ничего не делает в сборках релиза.

GSL контрактcheck

В зависимости от конфигурации это может:

  1. Бросить исключение
  2. Завершить
  3. Ничего не делать
    • … кроме сигнала оптимизатору о том, что мы ожидаем, что условие будет выполнено (если поддерживается)

В некоторых режимах конфигурации, я полагаю, GSL's Expects иEnsures макросы в конечном итоге делают почти то же самое, что и assert.Но не во всех.

Стоит отметить, однако, что поведение GSL, по-видимому, не зависит от конфигурации сборки (отладка против выпуска).Я предполагаю (и я только предполагаю), что для критичного к производительности кода разумный сопровождающий проекта выберет режим # 1 или # 2 в отладочных сборках и # 3 (или, возможно, # 2) в сборках релиза.

...