У меня есть несколько довольно дорогостоящих вызовов static_assert
, разбросанных по моему коду. Хотя они ценны, они часто излишни и значительно увеличивают время компиляции и использование памяти.
Могу ли я отключить их?
У меня есть несколько довольно дорогостоящих вызовов static_assert
, разбросанных по моему коду. Хотя они ценны, они часто излишни и значительно увеличивают время компиляции и использование памяти.
Могу ли я отключить их?
Оберните их в стандартный макрос NDEBUG
.
#ifndef NDEBUG
static_assert(...);
#endif
Таким образом, для выпускных сборок вы можете отключить их, как обычные assert
. Хотя смысла в этом особо не вижу.
Если вам не нравится оборачивать вызовы в макрос, вы можете определить макрос, который сделает это за вас:
#ifndef STATIC_ASSERT
#ifndef NDEBUG
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__)
#else
#define STATIC_ASSERT(...) static_assert(true, "")
#endif // NDEBUG
#endif // STATIC_ASSERT
Использование аналогично обычному static_assert
. Обратите внимание, что если ваша программа определяет ключевое слово и включает стандартный заголовок библиотеки, то определение макроса static_assert
является неопределенным поведением.
static_assert
) с проверками во время выполнения. Если вы хотите удалить один из них, вполне возможно, что вы не хотите отключать и другие.
- person Deduplicator; 30.10.2014
NDEBUG
из-за знакомства.
- person Rapptz; 30.10.2014
do { } while(0)
не будет работать для static_assert
в пространстве имен или в телах классов.
- person reima; 30.10.2014
/**/
, просто приведет к предупреждению, которое является ошибкой с -Werror.
- person Rapptz; 30.10.2014
#define STATIC_ASSERT(...) static_assert(true, "")
?
- person reima; 30.10.2014
Вы можете либо обернуть их, каждый для себя, в свой собственный #ifdef
:
#ifndef NO_STATIC_ASSERT
static_assert(...);
#endif
Или вы можете определить свой собственный STATIC_ASSERT
:
#ifndef NO_STATIC_ASSERT
#define STATIC_ASSERT(...) /**/
#else
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__)
#endif
#define static_assert(...)
works too, though it is UB.Таким образом, вы можете устранить их влияние на производительность компиляции (в любом случае они никогда не влияли на производительность во время выполнения).
static_assert
— поведение undefined
- person Rapptz; 30.10.2014
static_assert
вызовы несут ответственность за все эти накладные расходы? - person Brian Bi   schedule 30.10.2014static_assert
— это удалить их из кода, который будет скомпилирован, например, с помощью препроцессора. Они никоим образом не влияют на скомпилированный код. - person Deduplicator   schedule 30.10.2014