x86_64의 경우 함수 및/또는 멤버에 대한 포인터가 멤버 함수에 대한 포인터의 크기를 초과하지 않는다고 안전하게 가정 할 수 있습니다. GCC의 경우이 값은 sizeof(void*)
입니다. clang의 경우 이것은 sizeof(void*)*2
(마지막으로 확인한 시간)입니다. 정렬 요구 사항은 16 바이트입니다. GCC를 사용하면 __BIGGEST_ALIGNMENT__
미리 정의 된 매크로를 사용할 수 있습니다. 그러나 clang에는 결석이 있습니다. 내가 제안 할 수있는 유일한 방법은 가정하지 말고 가장 큰 크기를 계산하는 컴파일 타임 식을 사용하는 것입니다.
UPDATE : @ 데이비드로
가 8 바이트 여러 및/또는 가상 상속의 경우 멤버 함수 호출을 파견하기 위해 충분하지 않을 수 있습니다 지적했다. 따라서 안전한 측면을 유지하기 위해 두 경우 모두 sizeof(void*)*2
이 적용됩니다.
가장 좋은 방법은 sizeof
을 사용하는 컴파일 타임 표현식입니다. 예를 들면 다음과 같습니다.
struct Foo {
};
typedef void* (Foo::*pmf)();
typedef void* (*bar)();
constexpr auto max_func_pointer_size() -> decltype(sizeof(void*)) {
return sizeof(pmf) > sizeof(bar) ? sizeof(pmf) : sizeof(bar);
}
int main()
{
static_assert(max_func_pointer_size() == 16, "oops!?");
}
아니요. 'sizeof' 이유가 존재합니다. –
대답은 여전히 동일합니다. ** 아니요, 아무 것도 생각하지 않아도됩니다 **. –
그는 효율성이 중요하다고 말했다. 때로는 효율성을 높이기 위해 일을 맡아야하는 경우가 있으며 때로는 유형의 크기에 관한 것을 가정하는 경우도 있습니다. – thang