#include <IOSTREAM>
using namespace std;
class Base
{
public:
Base()
{
cout<<"基类构造函数"<<endl;
}
~Base()
{
cout<<"基类析构函数"<<endl;
}
virtual void f(int)
{
cout<<"Base::f(int)"<<endl;
}
protected:
private:
};
int main()
{
cout<<sizeof(Base)<<endl;
}
1、书上说输出为4,之前我看书说一个空类编译器给它的空间大小是1,为什么这会又变成4了呢?
2、计算类的字节大小都有什么注意事项啊?
18 个解决方案
#1
含有虚函数的类,其对象一般会有一个VPTR指针指向该类的虚表的
#2
因为楼主列举的Base类含有虚拟函数,一般的编译器都会给每个对象安插一个VPTR指向该类的虚表,
所以该类对象的大小就是指针的大小了
在计算类对象大小时注意的问题:
1.字节对齐
2.考虑编译器安插的东西的大小,如存在虚拟函数和虚拟基类时
3.空基类优化
所以该类对象的大小就是指针的大小了
在计算类对象大小时注意的问题:
1.字节对齐
2.考虑编译器安插的东西的大小,如存在虚拟函数和虚拟基类时
3.空基类优化
#3
你的Base类,有一个虚函数的原因吧
#4
1、类的大小只包括那些成员变量的大小,成员函数不计算在内;
2、类构成元素既可以是基本数据类型(如 int 、 long 、 float 等)的变量,也可以是一些复合数据类型(如 array 、 struct 、 union 等)的数据单元。编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界( natural alignment )条件分配空间。(自然对界 (natural alignment) 即默认对齐方式,是指按结构体的成员中 size 最大的成员对齐。)
3、静态成员也是全局,不在类里,但是const成员要分配空间。
参见:http://eriol.iteye.com/blog/1004580
2、类构成元素既可以是基本数据类型(如 int 、 long 、 float 等)的变量,也可以是一些复合数据类型(如 array 、 struct 、 union 等)的数据单元。编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界( natural alignment )条件分配空间。(自然对界 (natural alignment) 即默认对齐方式,是指按结构体的成员中 size 最大的成员对齐。)
3、静态成员也是全局,不在类里,但是const成员要分配空间。
参见:http://eriol.iteye.com/blog/1004580
#5
如何查看一个类的内存布局:
如果想查看文件Program.cpp中的类D的对象在内存中的分布情况,先进入cmd命令窗口,改变目录到Program.cpp所在的目录,然后键入如下命令:
cl Program.cpp /d1reportSingleClassLayoutD
就可以看到D的内存布局。
备注:
Program.cpp --------为程序名称
D----------------------为类名称
#6
撮鸟~ 析构函数是虚函数 有个虚表指针
#7
含有虚函数的类,默认会有一个虚函数指针 所以sizeof(*) = 4
#8
为什么说析构函数是虚函数?
#9
虚表指针
#10
哎呀 洒家看错了
virtual void f(int)
{
cout<<"Base::f(int)"<<endl;
}
这个函数是,撮鸟对不住您啦
#11
你可以吧 虚函数 去掉 在看看结果。。
然后再加上虚函数。调试下。。 就明白了 !!!
然后再加上虚函数。调试下。。 就明白了 !!!
#12
++
#13
参考!
#15
没人说析构函数是虚函数。f()啊
#16
学习。。。
#17
有虚函数,就会有虚函数表,占一个指针的大小,4个字节。
#18
老大,你太厉害了,这么多人属你最聪明,以后我有不会的就问你了,呵呵
#1
含有虚函数的类,其对象一般会有一个VPTR指针指向该类的虚表的
#2
因为楼主列举的Base类含有虚拟函数,一般的编译器都会给每个对象安插一个VPTR指向该类的虚表,
所以该类对象的大小就是指针的大小了
在计算类对象大小时注意的问题:
1.字节对齐
2.考虑编译器安插的东西的大小,如存在虚拟函数和虚拟基类时
3.空基类优化
所以该类对象的大小就是指针的大小了
在计算类对象大小时注意的问题:
1.字节对齐
2.考虑编译器安插的东西的大小,如存在虚拟函数和虚拟基类时
3.空基类优化
#3
你的Base类,有一个虚函数的原因吧
#4
1、类的大小只包括那些成员变量的大小,成员函数不计算在内;
2、类构成元素既可以是基本数据类型(如 int 、 long 、 float 等)的变量,也可以是一些复合数据类型(如 array 、 struct 、 union 等)的数据单元。编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界( natural alignment )条件分配空间。(自然对界 (natural alignment) 即默认对齐方式,是指按结构体的成员中 size 最大的成员对齐。)
3、静态成员也是全局,不在类里,但是const成员要分配空间。
参见:http://eriol.iteye.com/blog/1004580
2、类构成元素既可以是基本数据类型(如 int 、 long 、 float 等)的变量,也可以是一些复合数据类型(如 array 、 struct 、 union 等)的数据单元。编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界( natural alignment )条件分配空间。(自然对界 (natural alignment) 即默认对齐方式,是指按结构体的成员中 size 最大的成员对齐。)
3、静态成员也是全局,不在类里,但是const成员要分配空间。
参见:http://eriol.iteye.com/blog/1004580
#5
如何查看一个类的内存布局:
如果想查看文件Program.cpp中的类D的对象在内存中的分布情况,先进入cmd命令窗口,改变目录到Program.cpp所在的目录,然后键入如下命令:
cl Program.cpp /d1reportSingleClassLayoutD
就可以看到D的内存布局。
备注:
Program.cpp --------为程序名称
D----------------------为类名称
#6
撮鸟~ 析构函数是虚函数 有个虚表指针
#7
含有虚函数的类,默认会有一个虚函数指针 所以sizeof(*) = 4
#8
为什么说析构函数是虚函数?
#9
虚表指针
#10
哎呀 洒家看错了
virtual void f(int)
{
cout<<"Base::f(int)"<<endl;
}
这个函数是,撮鸟对不住您啦
#11
你可以吧 虚函数 去掉 在看看结果。。
然后再加上虚函数。调试下。。 就明白了 !!!
然后再加上虚函数。调试下。。 就明白了 !!!
#12
++
#13
参考!
#14
#15
没人说析构函数是虚函数。f()啊
#16
学习。。。
#17
有虚函数,就会有虚函数表,占一个指针的大小,4个字节。
#18
老大,你太厉害了,这么多人属你最聪明,以后我有不会的就问你了,呵呵