Skip to content
cheyiliu edited this page Nov 28, 2014 · 15 revisions

结构体的对齐规则

一般来说,结构体的对齐规则是先按数据类型自身进行对齐,然后再按整个结构体进行对齐,对齐值必须是2的幂,比如1,2, 4, 8, 16。如果一个类型按n字节对齐,那么该类型的变量起始地址必须是n的倍数。比如int按四字节对齐,那么int类型的变量起始地址一定是4的倍数,比如0x0012ff60,0x0012ff48等。

数据自身的对齐

数据自身的对齐值通常就是数据类型所占的空间大小,比如int类型占四个字节,那么它的对齐值就是4

整个结构体的对齐

整个结构体的对齐值一般是结构体中最大数据类型所占的空间,比如下面这个结构体的对齐值就是8,因为double类型占8个字节。

struct Test2 { int i ; double d ; };

other note

//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
Clone this wiki locally