I'm trying to check address of member functions (dynamic, static and virtual) by following code. Since cout will convert such function address as bool type, so printf is used.
#include <iostream>
#include <stdio.h>
using namespace std;
class comple
{
public:
void display () { cout << "comple: member" << endl; }
static void display_s () { cout << "comple: static" << endl; }
virtual void display_v () { cout << "comple: virtual" << endl; }
int real, imag;
};
class B:public comple
{
public:
virtual void display_v ();
};
void B::display_v () { cout << "B: virtual" << endl; }
int main () {
printf ("1:comple: member=%p, \n", &comple::display);
printf ("2:comple: static=%p, \n", &comple::display_s);
printf ("3:comple: virtual=%p, \n", &comple::display_v);
printf ("4:comple: member=%p, static=%p\n", &comple::display, &comple::display_s);
printf ("5:comple: member=%p, virtual=%p\n", &comple::display, &comple::display_v);
printf ("6:comple: member=%p, static=%p, virtual=%p\n", &comple::display, &comple::display_s, &comple::display_v);
return 0;
}
Then outputs:
1:comple: member=0x400ae0,
2:comple: static=0x400b0a,
3:comple: virtual=0x1,
4:comple: member=0x400ae0, static=(nil)
5:comple: member=0x400ae0, virtual=(nil)
6:comple: member=0x400ae0, static=(nil), virtual=0x400b0a
Outputs 1/2/3 seems OK, but static function address in output 4/6 is nil, which is supposed to have something, and virutal address of output 6 is actually static fucntion's address. Anyone can give a comment? thank you!
I'm using g++ version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC).
========================================================================== I'd like to add some more details about assembly code of output 1/2/3 in C++ program above:
movq $0, -248(%rbp)
movq -256(%rbp), %rdx
movq -248(%rbp), %rax
movq %rdx, %rsi
movq %rax, %rdx
movl $.LC3, %edi
movl $0, %eax
.cfi_offset 3, -24
call printf //printf ("1:comple: member=%p, \n", &comple::display);
movl $_ZN6comple9display_sEv, %esi
movl $.LC4, %edi
movl $0, %eax
call printf //printf ("2:comple: static=%p, \n", &comple::display_s);
movq $1, -240(%rbp)
movq $0, -232(%rbp)
movq -240(%rbp), %rdx
movq -232(%rbp), %rax
movq %rdx, %rsi
movq %rax, %rdx
movl $.LC5, %edi
movl $0, %eax
call printf //printf ("3:comple: virtual=%p, \n", &comple::display_v);
In output 1/3, 2 64-bit words are used as arguments, while only 1 32-bit word is used for augument of output 2.