现在的位置: 首页 > 综合 > 正文

关于CSAPP读到的一些(1)——Alignment(出自Machine-Level Representation of Program)

2013年09月15日 ⁄ 综合 ⁄ 共 839字 ⁄ 字号 评论关闭

话说从来没有考虑过变量定义的顺序会给程序运行时候的效率造成多大的影响。原来一直都比较天真,暑假开始看了CSAPP,类似于计算机体系结构,但是是从编程的角度来写的,现在还在和影印版死磕中,用了一个多礼拜的时间总算读完了Machine-Level Representation of Program这一章,脑袋里面只剩下。。。GCC。。。和汇编语言。。。汗。。不过编译器真的很强大,直接造成我们只管写代码,不管底层的操作之类的习惯。

今天读到data alignment的时候才发现,原来。。在struct里面定义不同变量的时候往往顺序的不同,造成的内存分配也是不一样的,内部各个变量的偏移位置也是不同的。此处,linux和windows的规定又是不一样的。

之所以会有对齐限制(Limit Alignment)完全是为了简化存储和CPU之间的硬件接口的设计难度。

linux下,小类型的alignment为2的倍数,即short之类的类型,偏移位置必须得从2的倍数大小开始,而其他的大类型变量的偏移位置需要从4的倍数开始偏移。例如:

struct MixedData
{
    int Data1;      
    short Data2;
    int Data3;
};

Data1的偏移量为0,Data2的偏移量为4,Data3的偏移量就为8。gcc在翻译这段代码的时候会自己在Data2和Data3之间插入2Byte的空间以达到linux的偏移限制。而若将此结构体定义为

struct MixedData
{
    int Data1;
    int Data3;
    short Data2;
};

则分配的内存空间和前一个结构体就是完全不一样的。

在windows下面这种限制更为严格。基本是按照若一个类型的大小是M Byte,那么该类型变量在结构体中的偏移量只能是M的倍数,即N*M的偏移位置。所以win下结构体中定义的变量顺序会导致的内存浪费比较多。

嗯。。其实这一章还有比较重要的地方在于递归调用的时候系统各个处理器的处理情况其汇编语言的写法。。。但是这个比较常见了。。。

抱歉!评论已关闭.