Мога ли да деактивирам статичните твърдения?

Имам някои доста скъпи static_assert повиквания, разпръснати из моя код. Въпреки че те са ценни, те често са излишни и значително допринасят за времето за компилиране и използването на паметта.

Мога ли да ги деактивирам?


person quant    schedule 30.10.2014    source източник
comment
да Като ги премахнете.   -  person Rapptz    schedule 30.10.2014
comment
@Rapptz Как да ги активирам отново?   -  person quant    schedule 30.10.2014
comment
Сигурни ли сте, че тези static_assert обаждания са отговорни за всички тези разходи?   -  person Brian Bi    schedule 30.10.2014
comment
@Brian не всичко, но много от тях включват нетривиални метафункции, които допринасят значително и не са необходими за всички компилации.   -  person quant    schedule 30.10.2014
comment
Единственият начин да деактивирате static_asserts е като ги премахнете от кода, който ще бъде компилиран, например чрез използване на препроцесора. Те по никакъв начин не допринасят за компилирания код.   -  person Deduplicator    schedule 30.10.2014
comment
Донякъде „мета“ бележка. Наистина трябва да започнете да приемате отговори. Вашите последни 20 или повече въпроса нямат приети отговори. Тук обикновено се гледа с лошо око на това.   -  person Rapptz    schedule 31.10.2014
comment
@Rapptz Склонен съм да изчакам или да получа перфектен отговор, или докато не се убедя, че отговорът е толкова добър, колкото и това, което може да се направи, като се има предвид въпросът. Винаги маркирам отговорите накрая, с много малки изключения (погледнете моята история). Смятате ли, че това е лоша практика?   -  person quant    schedule 31.10.2014


Отговори (2)


Извинения, напълно сте прав, това беше правописна грешка от моя страна, сега коригирана. По някаква причина ми беше хрумнало в главата, докато пишех този отговор, че ddply е отделен пакет. да!
person Rapptz    schedule 30.10.2014
comment
Не харесвам особено това решение, но предполагам, че ще свърши работа. - person quant; 30.10.2014
comment
@quant Поради техния аспект по време на компилиране това е единственият начин да го направите. Или това, или да ги премахнете правилно. - person Rapptz; 30.10.2014
comment
Наистина не препоръчвам свързването на статични проверки (static_assert) с проверки по време на изпълнение. Ако искате да премахнете един от тях, е напълно възможно да не искате да деактивирате и останалите. - person Deduplicator; 30.10.2014
comment
@Deduplicator Може да бъде заменен от какъвто и да е макрос, дефиниран по време на процеса на компилиране. Току-що използвах NDEBUG поради познатост. - person Rapptz; 30.10.2014
comment
Замяната do { } while(0) няма да работи за static_asserts в обхвата на пространството от имена или в телата на класа. - person reima; 30.10.2014
comment
@reima Добър улов. Не мога да се сетя за добър начин да поправя това извън преместването на точка и запетая към макроса. Използването на коментар като /**/ просто ще доведе до предупреждение, което е грешка с -Werror. - person Rapptz; 30.10.2014
comment
Какво ще кажете за #define STATIC_ASSERT(...) static_assert(true, "")? - person reima; 30.10.2014

  1. Можете или да ги опаковате, всеки за себе си, в свой собствен #ifdef:

    #ifndef NO_STATIC_ASSERT
    static_assert(...);
    #endif
    
  2. Или можете да дефинирате свой собствен STATIC_ASSERT:

    #ifndef NO_STATIC_ASSERT
        #define STATIC_ASSERT(...) /**/
    #else
      #define STATIC_ASSERT(...) static_assert(__VA_ARGS__)
    #endif
    
    • In practice, #define static_assert(...) works too, though it is UB.
  3. Или можете просто да ги премахнете ръчно.

По този начин можете да премахнете тяхното влияние върху производителността на компилацията (те така или иначе никога не са имали никакво влияние върху производителността по време на изпълнение).

person Deduplicator    schedule 30.10.2014
comment
добре, не се сетих за второто. Благодаря :) - person quant; 30.10.2014
comment
дефинирането на ваш собствен макрос static_assert е недефинирано поведение - person Rapptz; 30.10.2014
comment
@Deduplicator Дефинирането на ключови думи чрез препроцесора е недефинирано поведение, ако TU или заглавката включва стандартна заглавка на библиотеката, което е вероятно. Вижте тук. - person Rapptz; 30.10.2014
comment
@Deduplicator Да. Коментарите на Йоханес изглежда подкрепят твърденията ми и аз му вярвам. Това обаче е доста стар и дълъг дебат с много история. - person Rapptz; 30.10.2014
comment
@Deduplicator Това е в последната чернова тук . Все пак не искам да удължавам тази дискусия. Обсъдете това в фоайето, ако искате. - person Rapptz; 30.10.2014
comment
@Rapptz: Няма нужда. Потърсих всички останали цитати, но този със сигурност е достатъчен. - person Deduplicator; 30.10.2014