Взяв этот пример: https://godbolt.org/z/gHqCSA
#include<iostream>
template<typename Return, typename... Args>
std::ostream& operator <<(std::ostream& os, Return(*p)(Args...) ) {
return os << (void*)p;
}
template <typename ClassType, typename Return, typename... Args>
std::ostream& operator <<(std::ostream& os, Return (ClassType::*p)(Args...) )
{
unsigned char* internal_representation = reinterpret_cast<unsigned char*>(&p);
os << "0x" << std::hex;
for(int i = 0; i < sizeof p; i++) {
os << (int)internal_representation[i];
}
return os;
}
struct test_debugger { void var() {} };
void fun_void_void(){};
void fun_void_double(double d){};
double fun_double_double(double d){return d;}
int main() {
std::cout << "0. " << &test_debugger::var << std::endl;
std::cout << "1. " << fun_void_void << std::endl;
std::cout << "2. " << fun_void_double << std::endl;
std::cout << "3. " << fun_double_double << std::endl;
}
// Prints:
// 0. 0x7018400100000000000
// 1. 0x100401080
// 2. 0x100401087
// 3. 0x100401093
Я вижу адрес функции-члена 0x7018400100000000000
, что понятно, поскольку указатели на функции-члены имеют 16 байты, в то время как свободная функция как 0x100401080
имеет только 8 байтов.
Однако почему адрес функции-члена 0x7018400100000000000
так далек от адреса свободной функции 0x100401080
? то есть |0x7018400100000000000 - 0x100401080| = 0x70184000FFEFFBFEF80
?
Почему это не ближе, т.е. что-то вроде 0x100401...
вместо 0x701840...
? Или я неправильно печатаю адрес функции-члена?