【发布时间】:2012-04-03 07:15:46
【问题描述】:
我最近在bitsquid博客上读了一篇关于如何管理内存的文章,作者开始谈论vtable以及编译器如何将指针添加到类中。这是article 的链接。所以因为我对 vtalbe 几乎一无所知,所以我开始在网上搜索解释。我遇到了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!"); }
};
基本上我想要做的是查看 vtable 内的指针是否会指向与我从 &A::sayHello 获得的地址相同的位置,但问题是当我运行程序时,里面的地址vtable 中的指针和sayHello() 地址总是有295 的差异。有谁知道为什么会发生这种情况?是否添加了某种我缺少的标题?我在 64 位机器上运行 Visual Studio Express 2008。
根据我的调试,*funcPointer 返回的地址是函数sayHello() 的真实地址。但是为什么&A::sayHello() 返回一个不同的地址呢?
【问题讨论】:
-
你能说明
A类的定义吗? -
这是实现定义的,并且在更大程度上取决于类的定义。如果没有
A(和编译器/架构)的定义,就没有什么可以说的了。
标签: c++ memory-management vtable