《C专家编程》里关于总线错误的一个例子
union {
char a[10];
int i;
}u;
int *p = ( int * )&( u.a[1] );
*p = 17;
书中给出的解释是:将导致一个总线错误,因为数组和int的联合确保a是按照int的4字节对齐的,所以"a + 1"的地址肯定未按int对齐。然后我们试图往这个地址存储4个字节的数据,但这个访问只是按照单字节的char对齐,这就违反了规则。
这个规则就是:数据项只能存储在地址是数据项大小的整数倍的内存未知上。
我用vs2012编译测试,并未出现错误。
调试发现u.a[10]这个数据里的元素的地址是按照1个字节偏移的,并没有按照4字节对齐,so...我觉得书中所说的不大对劲,是过时了吗,还是我自己想错了,求解释!
[解决办法]
这个应该是跟体系结构有关,不应该说“一定会出现总线错误”。
有的处理器上会出现总线错误,有的处理器可能性能低一些,有的处理器上则可能完全感觉不到异样。
[解决办法]
正解!
[解决办法]
《C专家编程》有点老,计算机技术日新月异,而且有一些新技术很少看到介绍,有些知识了解一下就好
[解决办法]
这个和编译器以及CPU体系都有关系.
部分CPU, 一次读取4字节数据, 必须从4字节对齐的地址开始; 而另一些不必须.
对前者, 编译器可以将一条"从非对齐地址读取4字节数据的指令"转换成17条读取单字节数据和移位指令从而在功能上达到相同的效果, 但性能可能下降.
对后者, 这类CPU通常功耗会高一些, 从而约束了在某些场景(如移动手持终端)上的使用.
在新的程序中,直接出现总线错误已经很少了. 但明白这个道理, 在编程时避免这种用法还是有必要的.