我最近读有关如何管理内存bitsquid博客的文章,笔者函数指针开始谈论虚函数表,并有如何添加到类的指针由编译器。这里是article的链接。所以,因为我几乎不知道关于vtbebe的任何事情,所以我开始在网上搜索一个解释。我来到了this link。根据我阅读我做了如下代码:虚函数表,并指向不同的地址
char cache[24];
printf("Size of int = %d\n", sizeof(int));
printf("Size of A = %d\n", sizeof(A));
A* a = new(cache)A(0,0);
printf("%s\n",cache);
printf("vTable : %d\n",*((int*)cache));
printf("cache addr: %d\n",&cache);
int* funcPointer = (int*)(*((int*)cache));
printf("A::sayHello: %d\n",&A::sayHello);
printf("funcPointer: %d\n",*funcPointer);
A
是两个整数成员和一个虚函数sayHello()
类。
编辑:下面是类的定义:
class A {
public:
int _x;
int _y;
public:
A(int x, int y) : _x(x), _y(y){ }
virtual void sayHello() { printf("Hello You!"); }
};
基本上我试图做的是看是否为所在地址,我从&A::sayHello
得到虚函数表里面的指针会指向同一个地方,但是当我运行该程序时,vtable中指针内的地址和sayHello()
地址的地址总是有差别的是295
。有谁知道为什么会发生这种情况?是否有某种标题添加,我错过了?我在64位机器上运行visual studio express 2008。
从我调试过的地址返回的地址是*funcPointer
是函数sayHello()
的真实地址。但为什么&A::sayHello()
返回一个不同的地址?
你可以显示'A'类的定义吗? – Mysticial 2012-04-02 21:19:28
这是实现定义的,并且更大程度上取决于类的定义。没有'A'(和编译器/体系结构)的定义,几乎没有什么可以说的。 – 2012-04-02 21:26:36