함수 내부의 구조를 정의할 때 "벌점"이 있습니까?
그냥 호기심 때문에..
제목에서 알 수 있듯이 함수 내부의 구조를 정의하는 데 "벌점"이 있습니까?(성능, 기억력, 잘못된 프로그래밍 연습 등)
추신. 함수 내부에 (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
'programing' 카테고리의 다른 글
Android의 strings.xml 파일에 오류가 발생했습니다. (0) | 2023.10.20 |
---|---|
jQuery, JSON, PHP 및 gMap (0) | 2023.10.20 |
제품 페이지에서 클릭 가능한 이미지 방지, 제품-이미지 링크 비활성화 (0) | 2023.10.20 |
Mysql 날짜 함수가 다음 시간 동안 작동하지 않습니다. (0) | 2023.10.15 |
Woocommerce 주문내역에 상품선택비용 표시 (0) | 2023.10.15 |