1字节对齐———分不够我加
字节(Byte)是计算机信息技术用于计量存储容量和传输容量的一种计量单位,一个字节等于8位二进制数,在UTF-8编码中,一个英文字符等于一个字节。字节按照一定规则在空间上排列就是字节对齐。
对于32位机来说,4字节对齐能够使cpu访问速度提高,比如说一个long类型的变量,如果跨越了4字节边界存储,那么cpu要读取两次,这样效率就低了。但是在32位机中使用1字节或者2字节对齐,反而会使变量访问速度降低。所以这要考虑处理器类型,另外还得考虑编译器的类型。在vc中默认是4字节对齐的,GNU gcc 是默认4字节对齐。
其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。
struct{chara;doubleb;}在VC中,因为结构中存在double和char,按照最长数据类型对齐,char只占1B,但是加上后面的double所占空间超过8B,所以char独占8B;而double占8B,一共16Byte。在GCC中,double长度超过4字节,按照4字节对齐,原理同上,不过char占4字节,double占两个4字节,一共12Byte。
字节对齐,是对齐,比如说char 与 int 如果是4字节对齐,那么char也会占用4个字节,总共占8字节,而且结构体对象存储是按照顺序存的,char 肯定在int前面。
progma pack (1) /*指定按1字节对齐*/ struct D { char b;int a;short c;};progma pack () /*取消指定对齐,恢复缺省对齐*/ sizeof(struct D)值为7。对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。
C++字节对齐问题?
对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。需要字节对齐的根本原因在于CPU访问数据的效率问题。
使用关键字 #pragma pack (1) 开始字节对齐,使用 #pragma pack () 结束。比如:这样做的好处就是,在写入Flash的时候不会因为uint16_t/uint32_t这些类型数据而出错。
这是字节对齐概念 从你的内存表上看,你的编译器是4字节对齐的 也就是说,小于4字节,也会占用四字节的 例如,下面的结构各成员空间分配情况:struct test { char x1;short x2;float x3;char x4;};“结构的第一个成员x1,其偏移地址为0,占据了第1个字节。
结构体成员的字节对齐
1、arm支持16bit和32bit的地址访问,即变量地址能够被2或4整除,这时性能比较好,也便于移植。
2、位 与 64位 程序 对齐 有区别。 一个默认是4字节 一个是8字节。char 一个字节的,随便放。 大于1个字节的时候,需要注意对齐粒度了。禁止让一个多字节数据跨粒度了。 struct 前面的字段要对后面数据的 地址编号 的负责, 如果大于char了。 short 必须是2的倍数。
3、结构体所占的内存空间在理论上是等于它所包含的所有数据元素的,但在实际操作中像vc++0和c++bulider默认的都是8字节对齐,所以导致二者所占内存空间不一致。你可以在setting选项中将字节对齐方式设置为1字节对齐。