의 일부 조각을 선택 하는가? 기본적으로 이것은 -O2 또는 O3으로 컴파일 할 때 의미합니다.C++ 힘 컴파일러는 내가 코드 조각을 코드
고마워요! 다음,
// some code, which only do sanity check
#ifdef my_symbol
expensive checks
#endif
// sanity check end
의 일부 조각을 선택 하는가? 기본적으로 이것은 -O2 또는 O3으로 컴파일 할 때 의미합니다.C++ 힘 컴파일러는 내가 코드 조각을 코드
고마워요! 다음,
// some code, which only do sanity check
#ifdef my_symbol
expensive checks
#endif
// sanity check end
대신 밖으로 코드를 최적화하기 위해 컴파일러에 의존, 당신은 당신이 코드를 실행하려는 경우에만 컴파일러에게 추가 심볼 정의를 전달할 수 cassert을 가져오고 assert(expensive_check())
을 작성하십시오. 수표를 사용하지 않으려면 #define NDEBUG
을 앞에 넣고 cassert를 포함하십시오.
을 다른 기능으로 검사를 이동 :
상수 및 단일/if/def 쌍으로이 작업을 수행 할 수 있습니다. 이렇게하면 코드를 컴파일하고 오류를 검사 할 수 있지만 최적화 중에 생략 할 수 있습니다. 이렇게하면 검사 코드가 감지되지 않을 수있는 변경을 방지 할 수 있습니다.
#if defined(USE_EXPENSIVE_CHECKS) || defined(DEBUG)
#define USE_EXPENSIVE_CHECKS_VALUE true
#else
#define USE_EXPENSIVE_CHECKS_VALUE false
#endif
namespace {
const bool useExpensiveChecks = USE_EXPENSIVE_CHECKS_VALUE;
};
void function()
{
if(useExpensiveChecks == true)
{
// expensive checks
}
}
전처리 기에서 매크로와 조건을 사용하면 실제로 컴파일러에서 코드가 생성되는 것을 피할 수있는 유일한 방법입니다.
그래서, 여기에 내가 그것을 할 것입니다 방법은 다음과 같습니다#ifdef NEED_EXPENSIVE_CHECKS
inline expensive_checking(params...)
{
... do expensive checking here ...
}
#else
inline expensive_checking(params...)
{
}
#endif
은 그럼 그냥 전화 :
some code
expensive_checking(some_parameters...)
some other code
빈 인라인 함수는 어떤 점잖은 현대 컴파일러 "아니오 코드"가 발생합니다. 디버그 빌드 설정에서 -DNEED_EXPENSIVE_CHECKS
을 사용하고 릴리스 빌드에서 사용하지 마십시오.
: 이제
#ifdef NEED_EXPENSIVE_CHECKS
#define EXPENSIVE_CHECKS(stuff...) expensive_checks(__FILE__, __LINE__, stuff...)
inline expensive_checks(const char *file, int line, stuff ...)
{
if (some_checking)
{
cerr << "Error, some_checking failed at " << file << ":" << line << endl;
}
}
#else
#define EXPENSIVE_CHECKS(stuff...)
#endif
을, 당신은 경우에 매우 유용 할 수있는 라인 무언가가 실패 할 때 어떤 파일에 대한 정보를 얻을 수 검사는 여러 위치에서 이루어집니다 (원하는 경우 함수명을 얻기 위해 __function__
또는 __pretty_function__
을 사용할 수 있습니다).
분명히 assert()
매크로는 파일 이름과 줄 번호를 제공하지 않는다는 점을 제외하면 내 매크로 솔루션의 기능을 수행합니다.
글쎄, 더 좋은 방법이 있나요? 나는 이것을 제어하기 위해 어떤 깃발을 통과 할 수 있다는 것을 알고 있지만, 이것은 내가 원하는 것을 실제로는 아니다. – WhatABeautifulWorld
@WhatABeautifulWorld와 "더 나은 방법"은 무엇이라고 생각 하는가? –
@WhatABeautifulWorld 컴파일러가 마음을 읽을 것으로 기대합니까? 분명히 컴파일러에게 무엇을해야하는지 알려주고, 한 곳에서 (makefile) 그렇게하면 나에게 최적에 가깝게 보인다. – Voo