当前位置: 技术问答>linux和unix
请教字节对齐的疑问
来源: 互联网 发布时间:2016-10-06
本文导语: 今天看到一篇文章中介绍说:有些处理器不能从某些位置读或写多个字节;几乎所有的都不能从 奇数地址 来读数据。 那么我想将代码从pc移植到arm平台上,此代码中用到了malloc分配了一段内存空间,程序中需要用计算内存...
今天看到一篇文章中介绍说:有些处理器不能从某些位置读或写多个字节;几乎所有的都不能从 奇数地址 来读数据。
那么我想将代码从pc移植到arm平台上,此代码中用到了malloc分配了一段内存空间,程序中需要用计算内存地址的方法
读取该段内存空间中 某个结构体成员的数据,所以结构体用了__attribute__ ((packed))进行处理,
但是如果要读取的结构体成员是一个int型的数据,此时它的起始地址变成了奇数(而不是4的倍数),那arm 架构的cpu就不能读取此奇地址的数据了么?
如果不可以的话,有什么方法能读取我想要读取的数据(此时不能用变量名的方式进行操作)
|
楼主给你查了一下,绝对正确,如下:
struct A
{
int a;
char b;
char : 0; char : 8; char : 8; char : 8; char : 0; //三行占位符,和char b一起构成四字节对其
int c;
};
char b;
char : 0; char : 8; char : 8; char : 8; char : 0;
上面两行相当于手动对其了
char : 8 和 char : 0 都是有说法的,K&R上也只是提了一下,没细说。
如果不理解的话,再查查资料,但是绝对是对的。
struct A
{
int a;
char b;
char : 0; char : 8; char : 8; char : 8; char : 0; //三行占位符,和char b一起构成四字节对其
int c;
};
char b;
char : 0; char : 8; char : 8; char : 8; char : 0;
上面两行相当于手动对其了
char : 8 和 char : 0 都是有说法的,K&R上也只是提了一下,没细说。
如果不理解的话,再查查资料,但是绝对是对的。
|
并不是不能读,是说不能直接一次读奇数,碰到奇数必须读两次,这个机器底层会帮你搞定的,或者会抛出异常,不用担心。只是如果你从奇数读,会造成性能下降。所以编程应该尽量按照机器的对齐来读指针。
|
手动将数据结构对其