programing

함수 내부의 구조를 정의할 때 "벌점"이 있습니까?

padding 2023. 10. 20. 13:28
반응형

함수 내부의 구조를 정의할 때 "벌점"이 있습니까?

그냥 호기심 때문에..

제목에서 알 수 있듯이 함수 내부의 구조를 정의하는 "벌점"있습니까?(성능, 기억력, 잘못된 프로그래밍 연습 등)


추신. 함수 내부에 (NON-Template) 함수를 정의하는 것이 일반적인 관례라는 것은 알지만, 그래도..)

C++11에서는 아니요 - 패널티가 없습니다.물론 다른 곳에서 이 기능을 재사용하고 싶지 않다면 구현 세부 정보를 가지고 "더 눈에 보이는" 스코프를 오염시키지 않는 것이 매우 좋은 스타일이라고 생각합니다.그러나 람다는 기본적으로 이 아이디어의 축약된 형태이며, 구조를 단지 기능자로 사용하는 경우 일반적으로 선호되어야 합니다.모든 종류의 데이터에 대해, 그것은 완벽하게 괜찮습니다, 비록 그것은 보통 다음과 경쟁합니다.std::pair그리고.std::tuple그 점에서는

C++03에서는 이러한 구조를 템플릿 매개 변수로 사용할 수 없습니다. 왜냐하면 이러한 매개 변수는 외부 링크가 있어야 하기 때문입니다(Visual Studio에서는 어쨌든 사용할 수 있습니다).다형성 인터페이스와 함께 그러한 구조를 사용하는 것은 여전히 유용할 수 있습니다.

순전히 가시성 문제이기 때문에 성능이나 메모리 패널티가 발생할 수 있는 그럴듯한 시나리오는 상상할 수 없습니다.

C++03을 사용하는 경우 템플릿 인수로 로컬 정의 구조를 사용할 수 없지만 일부 컴파일러(즉, MSVC)에서는 허용합니다.

실적에 대해 문의하신 것은 알고 있지만, 다른 문제가 있어서 궁금했습니다.C와 C++ 둘 다를 요구하시는 건가요, 아니면 그 언어들 중 하나만 요구하시는 건가요?범위를 설정하거나 구조를 숨기기 위해 함수에 구조를 정의하려는 경우를 예상할 수 없습니다.

C의 경우, 별도의 모듈에서 구조를 정의하고 선언하여 정적으로 만들어 숨김에 접근할 수 있습니다.그러면, C++ 클래스의 회원들처럼 액세스 기능을 제공할 수 있습니다.구조물에 접근해야 하는 모듈에 대한 함수 선언을 .h 파일에 포함할 수 있습니다.

이것이 C++용인 경우, 클래스를 만들고 구조를 비공개 또는 보호하고 적절한 get/set/manipulation 메서드를 작성하는 것이 나머지 부분을 처리합니다.

원래 게시물을 편집하고 왜 이런 질문을 하는지 확대했다면 좋은 질문을 한 것입니다.

일부 구성원 함수가 컴파일 시간 제약 조건에 따라 호출할 수 없는 경우 로컬로 정의된 구조를 사용하여 템플릿 유형의 개체를 만들 수 없습니다.

예:

template<typename T>
concept C = requires(T t) { { t.unsupported() }; };

template <typename T>
struct X {
    void unsupported() { static_assert(std::is_void_v<T>); }
};
static_assert(C<X<int>>);

template <typename T>
C auto make()
{
    struct Y {
        void unsupported() { static_assert(std::is_void_v<T>); }
    };
    return Y{};
}

int main()
{
    C auto x = X<int>{};      // compiles fine
    C auto y = make<int>();   // error: static assertion failed
    return 0;
}

언급URL : https://stackoverflow.com/questions/10979984/are-there-any-penalties-for-defining-a-struct-inside-a-function

반응형