菜鸟的疑问:关于c++类实例对象内存布局的猜测和疑问,
一个类如果包含成员方法和成员变量。
那它是怎么体现某个成员方法属于某个对象的实例的?
我猜想是成员方法都是全局函数,只是只有这个类的实例才知道这个全局方法的内存地址。类外的代码不知道这个成员方法的地址所以无法调用它(显然安装单凭方法的名称找不到它)。类的实例可能保存了成员方法的地址,所以可以调用该成员方法。这就做到了封装.
可是网上说成员方法几乎不影响类的大小。
比如
class Base{
public:
int a;
void func();
};
B b;
sizeof(b)的大小是4
class Base{
public:
int a;
// void func();
};
B b;
sizeof(b)的大小也是4。
那是不是成员方法没有留下任何记录?那b是怎么找到func()方法的。
[解决办法]
楼主需要去看下《深度探索C++对象模型》了
[解决办法]
http://blog.csdn.net/w170532934/article/details/7635532
我转载的一篇关于微软关于C++的内存模型的文字
[解决办法]
从来就不存在“标准c++实现多态的策略”
[解决办法]
标准之所以是标准,就是因为它独立于实现
别猜测了,也别疑问了
你想的东西完全不靠谱,你该知道的东西书上全有
[解决办法]
要是一个非虚的函数的话,就不需要保存地址,因为在编译的时候,编译器就知道这个函数的地址,汇编的代码中就直接将这个函数地址转换为地址就好
而如果是虚函数的话,就需要在通过寻找虚函数表来找到具体的某个对象的地址
具体的例子,可以写个带虚函数的类和不带虚函数的类,将sizeof打出来看看就知道了,有虚函数的会大4个字节(VS2008平台)