Skip to content

Comments

gcc/g++ 컴파일 플래그에 NDEBUG 추가.#99

Open
sgkim126 wants to merge 1 commit intojongman:masterfrom
sgkim126:master
Open

gcc/g++ 컴파일 플래그에 NDEBUG 추가.#99
sgkim126 wants to merge 1 commit intojongman:masterfrom
sgkim126:master

Conversation

@sgkim126
Copy link

실제 코드 작성에 있어서 assert 구문을 사용하는 것은 가독성 있는 코드를 만들고, 코드가 하고자 하는 바를 명시적으로 보여주기 때문에 가독성 있는 코드를 만들기 위해 자주 사용됩니다.

하지만 현재의 연산 시간을 중요시하는 PS의 특성 상 알고스팟에서는 assert를 이용해서 조건 체크하는 것이 비용이 되기 때문에 assert를 사용하는 것은 언제나 손해를 보게 합니다.
이런 상황을 막고자 컴파일 옵션에 NDEBUG를 추가할 것을 제안합니다.

assert()를 사용하여 손해보는 경우를 없도록 합니다.
@wookayin
Copy link
Collaborator

좋은 제안 감사합니다. 그러면 assert(a[i] > 0); 와 같은 assert 문들이 모두 제거된 상태로 컴파일 되는것으로 알고 있는데요, 이것이 맞나요? assert를 명시적으로 건 경우에 대한 동작이 달라질 것 같습니다 (프로그램 버그나 논리적인 오류가 있다고 가정할 때 RTE가 안나고 답이 잘못 출력된다거나 등.)

기본적으로 여러 프로그래밍 컨테스트 환경에서는 NDEBUG 가 없는 환경이라 최대한 동일하게 맞추는 것이 필요할 것 같고, 일반적인 사용자들이 assert문이 의도한대로 동작하지 않아서 혼란을 초래할 수 있을것 같습니다.

덧붙여 개인적인 의견이라면 연산 시간이나 성능을 위해서 assert를 동작하지 않게 하기 위해서라면, <assert.h> 를 include 하기 전 (가령 소스코드 맨 첫줄) 에 직접 명시적으로 #define NDEBUG 를 선언해주는 쪽이 좀 더 나은 방향이라는 생각이 있습니다. 이에 관한 피드백이나 답변 환영합니다 :)

@sgkim126
Copy link
Author

네. assert 구문이 모두 제거된 상태로 컴파일됩니다.
따라서 assert 구문은 RTE를 잡기 위해서가 아니라 언제나 true인 expression을 명시해주기 위해서 사용합니다. 즉, assert가 꺼짐으로 인해 RTE가 발생할 코드가 잘못된 결과를 출력하는 경우는 잘못 작성된 코드이고 그로 인해서 답이 다르게 출력되거나 하는 것은 고려하지 않는게 맞다고 생각합니다.

하지만 다른 컨테스트 환경과 최대한 동일하게 맞추는 것이 목적이라면 NDEBUG를 사용하지 않는 것이 옳은 것 같습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants