简单归纳:
1.(无虚函数或有虚函数的)空类的sizeof是1,它的实例化也需要独一无二的空间地址
2.无虚函数的类的sizeof是内部成员大小之和
3.有虚函数的类的sizeof是内部成员大小之和再加4,这样的类有一个指向虚函数表的指针
4.子类的sizeof是基类的大小加上子类成员大小,若子类有新的虚函数也是如此
5.有静态成员的类,静态成员不占类的大小
6.类的虚继承会多出一个指针,指向的是虚基类成员偏移量数组

代码示例:
  1 #include <QCoreApplication>
  2 #include <QTextStream>
  3 #include <stdio.h>
  4 QTextStream cin(stdin, QIODevice::ReadOnly);
  5 QTextStream cout(stdout, QIODevice::WriteOnly);
  6 class CBase
  7 {
  8  /*类的实例化就是在内存中分配一块地址,空类也会被实例化,
  9    所以编译器给空类隐含的添加一个字节,这样空类实例化后就有了一个独一无二的地址了,
 10    所以空类的sizeof为1
 11    */
 12 };
 13 class CBase2
 14 {
 15     int a;//内部变量的大小之和
 16     char* p;
 17 };
 18 class CBase3
 19 {
 20 public:
 21     CBase3(void);
 22     virtual ~CBase3(void);//c++类中有虚函数的时候有一个指向虚函数的指针vptr
 23 private:
 24     int a;
 25     char *p;
 26 };
 27 class CChild: public CBase2
 28 {
 29 public:
 30     CChild(void);
 31     ~CChild(void);
 32 private:
 33     int b;//继承类的sizeof是
 34 };
 35 //虚拟继承(相当于添加了一个接口)
 36 //virtual虚继承让长度增加了4,其实是多了一个指针,它指向一个关于虚基类偏移量的数组,偏移量是关于虚基类数据成员的偏移量
 37 //注意,这个指针不是虚函数表指针
 38 class COneMember
 39 {
 40 public:
 41     COneMember(int iValue=0){m_iOne = iValue;};
 42 private:
 43     int m_iOne;
 44 };
 45 class CTwoMember : virtual public COneMember
 46 {
 47 private:
 48     int m_iTwo;
 49 };
 50 //关于闭合继承
 51 class A
 52 {
 53 public:
 54     A(int iValue=1){m_iA = iValue;};
 55 private:
 56     int m_iA;
 57 };
 58 class B :virtual public A
 59 {
 60 public:
 61     B(int iValue=2){m_iB = iValue;};
 62 private:
 63     int m_iB;
 64 };
 65 class C : virtual public A
 66 {
 67 public:
 68     C(int iValue=3){m_iC = iValue;};
 69 private:
 70     int m_iC;
 71 };
 72 class Complex : public B, public C
 73 {
 74 public:
 75     Complex(int iValue=4){m_iComplex = iValue;};
 76 private:
 77     int m_iComplex;
 78 };
 79 //虚空类为4,非虚空类为1
 80 class EVirtual
 81 {
 82 public:
 83     EVirtual(){printf("Construct/n");}
 84     virtual ~EVirtual(){ printf("Destruct/n");}
 85 };
 86 //静态成员不会占用类的大小
 87 class CStaticNull
 88 {
 89 public:
 90     CStaticNull(){};
 91     static void Foo(){printf("Foo/n");};
 92     static int m_iValue;
 93 };
 94 //虚函数:子类有新的虚函数,虚表还是只有一张
 95 class CVirtualNull
 96 {
 97 public:
 98     CVirtualNull();
 99     virtual ~CVirtualNull();
100     virtual Foo();
101 };
102 class CVirtualDerived : public CVirtualNull
103 {
104 public:
105     virtual FooDerived();
106 };
107 int main(int argc, char *argv[])
108 {
109     QCoreApplication a(argc, argv);
110     cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl;
111     cout<<"sizeof(CBase2)="<<sizeof(CBase2)<<endl;
112     cout<<"sizeof(CBase3)="<<sizeof(CBase3)<<endl;
113     cout<<"sizeof(CChild)="<<sizeof(CChild)<<endl;
114     cout<<"sizeof(CTwoMember)="<<sizeof(CTwoMember)<<endl;//12
115     cout<<"sizeof(Complex)="<<sizeof(Complex)<<endl;
116     cout<<"sizeof(EVirtual)="<<sizeof(EVirtual)<<endl;
117     cout<<"sizeof(CStaticNull)="<<sizeof(CStaticNull)<<endl;
118     cout<<"sizeof(CVirtualDerived)="<<sizeof(CVirtualDerived)<<endl;
119     return a.exec();
120 }
View Code

 

posted @ 2015-07-10 17:11 MayFirst 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 由“ can i get a char* , please?"看起:Just barely. OO.o has at least six string wrappers, although the C implementations are of little interest:rtl_String... 阅读全文
posted @ 2014-06-11 16:49 MayFirst 阅读(435) 评论(0) 推荐(0) 编辑
摘要: 对于单一的字节(a byte),大部分处理器以相同的顺序处理位元(bit),因此单字节的存放方法和传输方式一般相同。对于多字节的数据,如int,long,有大端和小端之分。 阅读全文
posted @ 2013-05-03 10:19 MayFirst 阅读(689) 评论(0) 推荐(0) 编辑
摘要: 从windows下拷贝的文件放到linux系统上看文件名称是乱码。解决:1、安装个convmv2、执行 convmv-rfGBK-tUTF-8--notest* 阅读全文
posted @ 2013-04-01 14:01 MayFirst 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 终端命令行cd /homeftp 1.1.1.1 连接 服务器Name: s #输入用户名Password: #输入密码//登录进去了ftp> bin #bin 代表采用二进制的文件ftp> ls #查看ftp目录下文件ftp>cd dir_aftp>lsa.tar.bz2ftp>get a.tar.bz2 //下载文件a.tar.bz2 到/home/下 阅读全文
posted @ 2012-12-21 11:26 MayFirst 阅读(941) 评论(0) 推荐(0) 编辑
摘要: 需要对新旧代码打补丁,从而别人可以拿着这个补丁文件很方便的打到相同基础版本上。1、如何做补丁文件?patch -p1 old new > filename.patchold,new 目录如下所示:old/module_name/dir_name/subdir_name/file1.cxx 旧文件new/module_name/dir_name/subdir_name/file1.cxx 新文件(在旧文件基础上修改了代码)2、如何应用补丁文件?patch -p1 < filename.patch3、如何剔除补丁文件?patch -R -p1 < filename.patch4、 阅读全文
posted @ 2012-11-07 18:01 MayFirst 阅读(249) 评论(0) 推荐(0) 编辑
摘要: window系统上cygwin下输入:ssh username@1.2.3.4username password:******于是就进入到linux系统scp username@1.2.3.4:/home/ooo_src/ooo.tar.gz./需要username密码:******复制linux系统上的文件ooo.tar.gz 到window系统 阅读全文
posted @ 2012-09-07 10:37 MayFirst 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 整个编译,在instsetoo_native/模块下: build -a -P4 --html完成后,最后编译instsetoo_native模块进行打包:build成功打包后,在instsetoo_native/outputdir/OpenOffice/native/install/zh-CN/下是中文安装程序,创建它的快捷方式,属性,添加/a 可以以一种不写注册表的方式安装(这样你可以同台机器安装多个版本)安装后的目录为office/你想调试哪个 模块,就进入到那个模块下,编译debug版本的动态库,去替换安装目录下相同名字的文件。进入sw模块:mv outputdir outputdir 阅读全文
posted @ 2012-09-07 09:46 MayFirst 阅读(462) 评论(0) 推荐(0) 编辑
摘要: 计算一个函数调用花费了多长时间。 int gettimeofday(struct timeval *tv,struct timezone *tz); //tz一般使用NULLstrut timeval { long tv_sec; /* 秒数 */ long tv_usec; /* 微秒数 */ }; #if OSL_DEBUG_LEVEL >1timeval aLast; float timeuse; gettimeofday(&aLast,NULL); #endiffunction(); //测量此函数执行所花费的时间#if OSL_DEBUG_LEVEL >1time 阅读全文
posted @ 2012-08-16 17:02 MayFirst 阅读(346) 评论(0) 推荐(0) 编辑
摘要: Apache的主配置文件http.conf(Windows环境下):LoadModule php5_module d:/php/php5apache2.dll AddType application/x-httpd-php .php注:其中d:/php/php5apache2.dll 是在Windows环境下php5apache2.dll文件的安装位置。 这两项配置就是告诉Apache Server,以后收到的Url用户请求,凡是以php作为后缀,就需要调用php5_module模块(mod_php5.so/ php5apache2.dll)进行处理。lamp架构:从下往上四层:①liunx 阅读全文
posted @ 2012-07-10 15:58 MayFirst 阅读(183) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示