-
Notifications
You must be signed in to change notification settings - Fork 43
sizeof
一般来说,结构体的对齐规则是先按数据类型自身进行对齐,然后再按整个结构体进行对齐,对齐值必须是2的幂,比如1,2, 4, 8, 16。如果一个类型按n字节对齐,那么该类型的变量起始地址必须是n的倍数。比如int按四字节对齐,那么int类型的变量起始地址一定是4的倍数,比如0x0012ff60,0x0012ff48等。
数据自身的对齐值通常就是数据类型所占的空间大小,比如int类型占四个字节,那么它的对齐值就是4
整个结构体的对齐值一般是结构体中最大数据类型所占的空间,比如下面这个结构体的对齐值就是8,因为double类型占8个字节。
struct Test2 { int i ; double d ; };
- 带虚函数的类,有一个指针指向虚函数表
- 上一句“有一个指针指向虚函数表”是不对的。 应该是 v-table指针的个数=有v-table指针的父类个数, [还是不正确,得看是多重继承还是单继承, 参考后面的链接]。 空类的sizeof = 1, 静态成员变量的size不算在类的sizeof上。 see, http://blog.csdn.net/haoel/article/details/1948051 , http://blog.csdn.net/pathuang68/article/details/4101999 系列。
//TODO, do more verify d和bn,n取[1,N]的定义如下: class d: public b1, b2, , , bN
求sum_vptr(d)的过程如下: d的v-ptr数量sum_vptr(d)等于: 如果,N = 0 如果d没virtual函数,sum_vptr(d) = 0; 如果d有virtual函数,sum_vptr(d) = 1; 如果,N > 0 x = sum_vptr(b1) + sum_vptr(b2) + ... + sum_vptr(bN); 如果 x = 0 如果d没virtual函数,sum_vptr(d) = 0; 如果d有virtual函数,sum_vptr(d) = 1; 如果 x > 0 sum_vptr(d) = x;
sum_vptr(bn)(n取[1,N],的算法同上
* 数组传递给函数作为参数,弱化为指针
* 结构体位域,不能超过对应类型的总位数,分配对齐以大B为单位,不够分配时从下一个大B开始
struct s4 { int i :30; int j :30; int a :2;//刚好能继续分配 double b; };//64位机,sizeof(s4) = 16 (B)
struct s4 { int i :30; int j :31;//不够分配,从下一个B开始分 int a :2;//不够分配,从下一个B开始分 double b; };//64位机,sizeof(s4) = 24 (B)
* 与strlen()比较
* strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。
* 而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。
# test
* https://github.com/cheyiliu/test4c/blob/master/sizeof
# 结构体对齐ref
* http://patmusing.blog.163.com/blog/static/13583496020100143952257/
* http://blog.csdn.net/zhongkeli/article/details/7002371
* http://blog.sina.com.cn/s/blog_74a271040100u15p.html
* http://www.cnblogs.com/bigrabbit/archive/2012/09/20/2695543.html
* http://www.cnblogs.com/chengxin1982/archive/2009/01/13/1374575.html
# 对象内存布局ref
* http://blog.csdn.net/pathuang68/article/details/4101999
* http://blog.csdn.net/bluedog/article/details/4711169
Just build something.