2017-11-22 3 views
2

사용자 이름과 권한 식별자로 구성된 Permission 클래스가 있다고 가정 해 봅니다. 이 액세스권 클래스의 생성자는, 유저가 그 액세스권을 가지고 있을지 어떨지를 체크해, 액세스권이없는 경우는 슬로우합니다.사용되지 않는 객체 및 링크 시간 최적화

이러한 권한 개체는 스택 변수이며 사용자 및 권한으로 구성됩니다. 해당 사용자에 대한 권한이 없으면 throw 될 것으로 예상됩니다.

이 권한 개체는 방금 구성 했으므로 최적화되지 않지만 다시 사용하지 않는다는 보장이 있습니까? (권한이 거부되면 throw해야 함)?

+0

그냥 말하면됩니다. 어떤 사람들은 생성자에서 발생하는 예외 및/또는 일반적인 테스트 목적으로 (비싼) 예외를 던지는 것을 좋아하지 않습니다. – Stefan

+2

@ 스 테판 : 그 사람들은 잘못입니다. 나는 그 것을 주관적이라고 부르지 않을 것입니다. C++ 생성자와 예외는 함께 처리되도록 설계되었습니다. 예를 들어, 생성자에서 오류 코드를 반환 할 수 없다는 것은 오류 코드를 반환하는 대신 예외를 throw한다는 사실에 의해 정당화됩니다. – MSalters

+0

@MSalters : 어쩌면 그 이유가 자신의 주장을 뒷받침하는 진정한 만족스러운 답을 찾지 못한 것일 수도 있습니다 .-) – Stefan

답변

1

이러한 권한 개체는 단지 구성 되었기 때문에 최적화되지 않지만 다시는 사용하지 않는다는 보장이 있습니까? (권한이 거부되면 throw해야 함)?

"그대로"(동일한 보증은 일반적으로 마찬가지로 사용되는 std::lock_guard에도 적용됩니다).

반드시 (일부 예외가 발생하지 않는 한 생성자가 일반적으로 유용한 것을하지 않으면 부작용 전용 생성자가 매우 놀랄 수 있으므로 )을 추가하십시오.

그 대답의 이전 버전은 BTW

, 컴파일러는 코드를 LTO-최적화 안 관련이 없습니다있는 volatile을 언급하지만 드문 경우 수 있습니다, 그래서 당신은 그들이 확인 할 수 아니.

+1

@ down-voter : 의견을주십시오. – Stefan

+2

@Stefan 나는 downvoting을 강하게 고려했지만 그 다음에는하지 않았다.그 이유는'휘발성 '을 권고하고 있기 때문이다. 그것은'휘발성 '이 무엇을위한 것이 아니며 절대적으로 신호를 보내지 않습니다 * "이 객체는 나에게 생성자 또는 소멸자에서 흥미로운 것을 수행합니다"*. 그리고 만약 여러분이 깨진 컴파일러를 수정하기 위해 여기에'휘발성 (volatile) '을 추가해야한다면,'휘발성'을 추가하는 것이 수정되지 않을 것입니다. – nwp

+0

나는 '휘발성'이 필요 없다는 점을 개선했다. 하지만 일부 주석이 필요하다고 강력하게 생각합니다. –

1

예. 최적화는 대개 컴파일러가 엄격하게 표준을 따르고 최적화를 수행하지 않은 것처럼 결과가 작동하는 한 원하는대로 컴파일러가 수행 할 수있는 "as-if-rule"을 기반으로합니다.

문제의 최적화로 인해 발생하는 예외 (throw 된 예외와 throw되지 않은 예외)가 변경되어 허용되지 않습니다. 물론 엄격히 표준을 따르는 것이 무의미한 것이기 때문에 코드에는 UB가 포함되어 있지 않는 한 (아무런 보장도 없음).

2

예. 최적화는 as-if 규칙에 따라 작동합니다. 프로그램은 호환되는 C++ 구현에서 실행중인 것처럼 작동해야합니다. 이제는 특정 "준수 동작"이 실제 하드웨어에서 기대하는 바가 아닐 수도 있습니다. 예 : 루프가 최적화 되었기 때문에 빈 루프의 속도가 CPU 모델에 비해 너무 빠를 수 있습니다.

그러나 모든 구현은처럼 생성자를 호출하는 것처럼 과 같아야합니다. 여기에는 생성자 (어셈블리에서 함수 호출 없음)를 인라이닝하는 것이 포함되지만 콘솔 I/O와 같은 ctor의 실제 내용은 여전히 ​​발생해야합니다.

관련 문제