C++中类的内存分配简单总结
2012-12-27 09:49
225 查看
类的内存分配简单总结
代码片段如下:
class
ClassA
{
private:
int
A;
int
B;
void
prin1()
{
}
void
prin2()
{
}
virtual
void
prin3()
{
}
};
class
ClassB:public
ClassA
{
public:
int
C;
int
D;
void
prin4()
{
}
void
prin5()
{
}
virtual
void
prin6()
{
}
};
int
_tmain(int
argc,
_TCHAR*
argv[])
{
cout<<sizeof(ClassA)<<endl;
cout<<sizeof(ClassB)<<endl;
return 0;
}
结果是12
20;
结果为什么是这样?
32位系统int占4个字节,而一个类中所有的虚函数通过一个虚函数指针管理,类对象的大小只包含这个vptr指针,其他虚函数是放在别的内存空间中管理,vptr指针也是4个字节大小。注意到普通成员函数并不占类对象的大小空间,因为普通成员函数通过this指针管理,一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。这个this指针会因编译器不同而有不同的放置位置,可能是栈,也可能是寄存器,甚至全局变量。子类其实不管如何继承,用sizeof()算该类的大小都会把父类中的私有成员变量所占的空间算进去,也就是说,私有变量也在子类中分配了类存,但你却不可以直接访问,这起到一个保护作用,我感觉这如同一个珠宝,共有继承就是开放性的展览,而私有继承是把珠宝锁起来,你却不能动,要动珠宝如果有管家(基类的public中定义了一些对其私有变量操作的成员函数,)只能让管家帮你代劳。所以基类就得出了12子类就得出了20。
代码片段如下:
class
ClassA
{
private:
int
A;
int
B;
void
prin1()
{
}
void
prin2()
{
}
virtual
void
prin3()
{
}
};
class
ClassB:public
ClassA
{
public:
int
C;
int
D;
void
prin4()
{
}
void
prin5()
{
}
virtual
void
prin6()
{
}
};
int
_tmain(int
argc,
_TCHAR*
argv[])
{
cout<<sizeof(ClassA)<<endl;
cout<<sizeof(ClassB)<<endl;
return 0;
}
结果是12
20;
结果为什么是这样?
32位系统int占4个字节,而一个类中所有的虚函数通过一个虚函数指针管理,类对象的大小只包含这个vptr指针,其他虚函数是放在别的内存空间中管理,vptr指针也是4个字节大小。注意到普通成员函数并不占类对象的大小空间,因为普通成员函数通过this指针管理,一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。这个this指针会因编译器不同而有不同的放置位置,可能是栈,也可能是寄存器,甚至全局变量。子类其实不管如何继承,用sizeof()算该类的大小都会把父类中的私有成员变量所占的空间算进去,也就是说,私有变量也在子类中分配了类存,但你却不可以直接访问,这起到一个保护作用,我感觉这如同一个珠宝,共有继承就是开放性的展览,而私有继承是把珠宝锁起来,你却不能动,要动珠宝如果有管家(基类的public中定义了一些对其私有变量操作的成员函数,)只能让管家帮你代劳。所以基类就得出了12子类就得出了20。
相关文章推荐
- oracle 内存分配和调优 总结
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- C结构体内存分配及sizeof大小总结
- sds(简单动态字符串) 内存预分配优化策略
- 进程内存分配和/proc/xxx/maps简单分析
- FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
- Linux开发心得总结9 - Linux中的内存分配和释放之kmem_cache_alloc()函数分析
- 指针在内存分配中的简单应用
- 【C语言总结】C语言动态内存分配
- C和指针之动态内存分配malloc、calloc、realloc简单使用和区别
- 最简单例子图解JVM内存分配和回收
- 堆栈、栈帧、函数调用、内存分配总结
- 最简单例子图解JVM内存分配和回收
- linux内存分配方法总结
- C/C++程序到内存分配个人总结
- python 内存管理简单总结
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
- MTK 内存管理简单总结
- 对象数组——简单内存分配