std::C++17의 optional vs optional 값에 대한 사용자 정의 유형
std::optional
.The class template
std::optional
manages an optional contained value, i.e. a value that may or may not be present.
저는 2017년부터 이 기능을 간단한 선택적 정수에 대해서도 많이 사용하고 있습니다. 오늘 저는 궁금한 점이 생겼습니다. 이 템플릿 유형이 동일한 동작을 달성하기 위해 직접 작성하는 동등한 유형과 비교하여 효과적입니까?
좋은 질문입니다, 감사합니다 😆
몇 가지 코드를 작성하고 Compiler Explorer을 사용하여 두 솔루션을 비교합니다.
먼저 두 가지 동등한 유형을 정의해 보겠습니다.
#include <optional>
using StdOptionalInt = std::optional<int>;
struct CustomOptionalInt {
bool has_value;
int value;
};
그런 다음 값을 사용할 수 있는지 테스트하고 이 값(사용할 수 있는 경우) 또는 기본값(사용할 수 없는 경우)을 반환하는 두 개의 함수를 작성해 보겠습니다.
int getStdOptional(const StdOptionalInt& o) {
return o.has_value() ? o.value() : 0;
}
int getCustomOptional(const CustomOptionalInt& o) {
return o.has_value ? o.value : 0;
}
마지막으로 컴파일러 탐색기로 코드를 컴파일하고 출력 어셈블리 코드를 비교합니다(직접 시도할 수 있음here).
응! 😃 두 함수는 동일한 어셈블리 코드를 생성합니다. 성능의 차이는 없습니다. 소스 코드 끝에 있는 정적 어설션에 주목하십시오. 코드가 컴파일되기 때문에 공간이 동일하다는 의미입니다. 동작은 x86-64의 gcc 및 clang과 동일합니다.
결론적으로
std::optional
는 선택적 정수 값을 나타내는 사용자 정의 유형만큼 효율적입니다. 자신의 유형을 구현하지 말고 단순히 표준 유형을 사용하십시오. cppreference에 설명된 대로 std::optional
를 사용하여 더 나은 성능을 얻을 수도 있습니다.As opposed to other approaches, such as
std::pair<T,bool>
,optional
handles expensive-to-construct objects well and is more readable, as the intent is expressed explicitly.
그건 그렇고, 만약 당신이 불어를 할 줄 안다면:
Reference
이 문제에 관하여(std::C++17의 optional vs optional 값에 대한 사용자 정의 유형), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/pgradot/std-optional-from-c-17-vs-custom-optional-value-3ia2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)