保存。 刮台风的夜晚,你想到什么? 上天注定的或许更美 Mckusic-karels; buddy system; slab阅读全文>
发表于 @ 2008年09月24日 00:44:00|评论(loading...)|编辑|收藏
1.程序编译连接之后的位置分配
如果不指定编链后的文件名,linux会自动产生一个a.out的文件,大概是汇编输出的意思,实际上这是链接之后的输出,而不是汇编之后的输出,之所以这样是个历史遗留问题。
a.out文件除去魔术数字等东西,我们最关心的是程序中各个段的分配。一个程序文件一般会分成这样几个区域:
text,data,bss段
text指的是程序文本文件
data指的是所有的经过初始化后的全局变量和静态变量
bss段则是未经初始化的全局变量和静态变量,但是bss段不增加目标文件的大小,一般只是记录bss段的大小。
由const修饰的变量将存放于text文件之中。局部变量放在栈中。
例如
ch阅读全文>
发表于 @ 2008年09月22日 18:04:00|评论(loading...)|编辑|收藏
Win32平台下的微软C编译器(cl.exe for 80×86)的对齐策略:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节,以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。
备注:结构体总大小是包括填充字节,最后一个成员满足阅读全文>
发表于 @ 2008年08月31日 12:43:00|评论(loading...)|编辑|收藏