Будет ли вызываться функция, вызов которой assert будет удален в Release ver программы? - PullRequest
1 голос
/ 26 ноября 2010

Если у меня есть что-то вроде:

static long double calcFactor_(const short mantissa, const short exponent,const short base = Derived::internals_.base_)
        {
            assert(mantissa > 0);
            assert(mantissa < NumericLimits<short>::max);
            assert(exponent < NumericLimits<short>::max);
            assert(exponent > NumericLimits<short>::min);
            assert(base < NumericLimits<short>::max);
            assert(base > NumericLimits<short>::min);
            return mantissa * ::pow(static_cast<long double>(base),exponent);
        }  

и в других местах моей программы я также использую эти идентичные вызовы assert, поэтому я хотел бы переместить его из этого тела fnc в отдельный fnc и размещать вызовы этого fnc только там, где они звонки в активы сейчас. Но поправьте меня, если я ошибаюсь: эти призывы к утверждению будут удалены в выпуске версии, но если у меня будет:

void Assert (//neccesary args here)
{
assert(mantissa > 0);
                assert(mantissa < NumericLimits<short>::max);
                assert(exponent < NumericLimits<short>::max);
                assert(exponent > NumericLimits<short>::min);
                assert(base < NumericLimits<short>::max);
                assert(base > NumericLimits<short>::min);
}

вызовет ли этот fnc также будет удален из релиза вер или нет? И еще один вопрос: я думаю, что вместо утверждений здесь я должен иметь проверки if (! Condition), потому что какая польза от утверждений, если они будут удалены в окончательной версии. Что ты думаешь?

Ответы [ 3 ]

1 голос
/ 26 ноября 2010

Вы всегда должны связывать проверку ошибок с утверждениями. В противном случае вы ничего не получите в режиме релиза, так как весь ваш код стабильности исчезнет. Так что, если бы я был на вашем месте, я бы вставил в вашу функцию операторы для защиты от неверных или недействительных данных.

Что касается того, будет ли ваша «пустая» функция удалена компилятором или нет в сборках выпуска, я думаю, это зависит от компилятора. Но я бы не оставлял утверждения в качестве единственного механизма определения того, действительны ли входные данные или нет. Я придерживаюсь, если заявления, чтобы остерегаться этого. Поэтому это как бы становится спорным вопросом.

1 голос
/ 26 ноября 2010

Да, assert не попадет в сборку релиза, но вызовы вашей функции Assert останутся. В лучшем случае ваш компилятор может обнаружить пустую функцию и подавить вызов, но я бы на это не рассчитывал. Если вы действительно хотите удалить эти вызовы из сборки выпуска, вы можете окружить их некоторыми #ifdef / #endif.

Что касается преимуществ утверждения, это явно "субъективно и аргументировано", так что я пройду!

0 голосов
/ 26 ноября 2010

Полагаю, это зависит от того, оптимизирует ли ваш компилятор пустой вызов функции (поскольку все эти assert s исчезнут).

...