作者:李云
摘要
字节对齐(alignment)是CPU在性能方面所面临的一个非常重要的问题。有些处理器能自动处理不对齐数据的访问(对字节对齐要求不严格),但是,有些处理器却无法处理(对字节对齐要求很严格)。当处理器无法处理对齐问题时,其将引发一个异常(exception),当然从程序的角度来说就是出错(crash)。
对于c程序员,大部分情况下我们并不考虑字节对齐问题,这并不是说我们并不需要考虑,而是因为碰到这种问题的情况很少。一方面要在特定的处理器上,而另一方面和我们写的程序也有关系。只有两个条件同时满足时问题才会出现。因此,结果给我们的感觉是”字节对齐与我无关”。
本文通过一小段代码通过在不同处理器上的运行结果引出对字节对齐问题的关注,同时进行原因分析。
- 1. 问题的引入
下面是一段被简化的程序,分别在windows(32位x86处理器)和solaris(32位的SPARC处理器)上编译和运行,其结果将完全不同。在windows上程序运行正常,但是在solaris上程序运行会出错,并且会在终端上打出”Bus Error”以及产生一个”Core Dump”文件。
代码语言:javascript复制typedef struct
{
Short mark;
Char body[128];
}msg_t;
typedef struct
{
char *pointer;
}header_t;
Int main(){
msg_t msg = {0};
void *p=((header_t*)msg.body)->pointer;
return 0;
}
为什么这么简单的一段程序在不同的操作系统(其实是处理器)上的运行结果却决然不同?这其实是一个cpu对齐所引发的问题,下面我们通过对字节对齐问题的分析来探究其背后的原理。后面的分析我们全部针对运行在32位SPARC处理器上的Solaris操作系统进行的。