2017-10-03 1 views
0

이것은 람다를 호출 할 수없는 람다 클래스의 예제입니다. 그것은 functor로 사용하기위한 것입니다.C++ 람다 크기

template<class T> 
struct lambda_class { 
T lambda; 
void operator()(){ lambda();} 
}; 

이 클래스의 크기는 어느 정도입니까? 내가 필요로하는 것은 그것을 유니온 안에 저장하는 것이지만, 특정 템플릿 인수 없이는 이것을 유니온 안에 넣을 수는 없다. 그 때문에 나는 람다의 최대 크기가 무엇인지 알아야합니다. 컴파일러와 관련된 것은 중요하지 않습니다.

편집 1 : 예, 내 의도는 std :: function이 내부적으로 구현되는 방식을 이해하는 것이 었습니다. 그래서 GNU libstdC++에 비해 읽기가 쉽기 때문에 EASTL을 선택했습니다.

다음 링크가 새로운 배치를 사용하는 것 같다 기능 구현을위한 코드를 포함하는 경우 : 이 https://github.com/electronicarts/EASTL/blob/master/include/EASTL/internal/function.h

내가 unterstand하지 않는 이유 않습니다 저장 타입으로이 맞지? 131 줄과 141 줄에는 펑터와 할당 자의 구조체 정의가 들어 있습니다. 람다가 하나 이상의 캡처 된 변수에 바인딩되면 어떻게됩니까?

+4

_ "어떤 람다도 호출 할 수 없습니다"_ 확실합니까? 이것은 몇 가지 변수 매개 변수와 전달이 필요하지 않습니까? – user0042

+2

왜 템플릿 인수를 지정하기 위해 크기를 알아야합니까? 최대 값은 없으며 제한이 없습니다 (컴파일러 제한을 무시함). – Rakete1111

+5

람다는 캡쳐 할 수 있기 때문에 기계가 처리 할 수있는 것을 제외하고는 크기에 제한이 없습니다. – NathanOliver

답변

4

std::function<void()>이 필요합니다.

std::function<void()>은 복사 및 소멸 가능한 호출 가능 개체 (0 개의 인수로 호출 할 수 있음)를 저장할 수 있습니다. 내부 버퍼 (함수 포인터를 저장할만큼 충분히 큼) 또는 힙 (너무 큰 경우)에 저장합니다.

이 작업은 형식 지우기라는 메커니즘을 통해 수행됩니다.

람다는 아니지만 람다를 저장할 수 있습니다.

비 POD C++ 클래스를 공용체 내에 저장하는 것은 약간의 고통입니다. 을 지원하는 경우 boost::variant 또는 std::variant을 사용하는 것이 좋습니다.

std::functionvariant없이이 문제를 해결하려면 템플릿 인스턴스가 아닌 데이터를 데이터로 저장하는 방법에 대해 궁금한 점이 있으면 기술 수준을 넘어서는 몇 가지 단계를 거쳐야합니다.

+0

제 의도는 힙 사용을 피하는 것이 었습니다. 지금이 순간은 힘든 것 같습니다. 힙 메모리를 사용하면 쉽습니다. – Gustavo

+0

@Gustavo "다음과 같은 질문을 던집니다."힙을 사용하지 않는'std :: function '을 갖고 싶습니다. 모든 lambdas에서 작동하지 않아도 괜찮지 만, 이상적으로는 빌드 할 때 깨기를 원합니다. if 나는 너무 큰 람다를 사용한다. " - 또는, 오히려, 그것을 쓰려고 노력하고, 문제가 생길 때 더 많은 질문을합니다. 지우기, std 함수, std :: aligned storage, placement new 등등에 대해 배웁니다. – Yakk

+0

마지막 질문 : 동적 메모리 할당을 사용하지 않고도 가능합니까? 필자가 생각하기에는 펑터 객체의 최대 저장 크기를 모르는 것이 아닙니다. 힙을 사용할 때 기본 클래스와 템플릿 클래스를 사용할 수 있습니다. – Gustavo