怎么做8字节内存对齐?
VC和GCC默认的都是4字节对齐,编程中可以使用#pragma pack(n)指定对齐模数。出现以上差异的原因在于,VC和GCC中对于double类型的对齐方式不同。
Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则: 任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。
比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。
Linux下的GCC奉行的是另外一套规则:任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。
复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。
struct{char a;double b;
} 在VC中,因为结构中存在double和char,按照最长数据类型对齐,char只占1B,但是加上后面的double所占空间超过8B,所以char独占8B;而double占8B,一共16Byte。 在GCC中,double长度超过4字节,按照4字节对齐,原理同上,不过char占4字节,double占两个4字节,一共12Byte。
什么是arm指令对齐、字对齐、地址对齐?
1、所谓对齐就是数据在存储器中存放的规则,32位系统中一般有字节对齐(8bit)、半字对齐(16bit)、字对齐(32bit)三种方式,分别对齐到连续地址、偶数地址、被4整除的地址。
2、arm体系结构中有ARM指令集和Thumb指令集2种,其中ARM指令为32位指令,按照4字节对齐存储,一条指令必须从4的整数倍地址来取;Thumb指令为16位指令,按2字节对齐存储,一条指令必须从偶数地址来取。
3、数据的存储:字符型数据一般为字节对齐存储、短整型按照双字节对齐存储、整型/浮点型按照4字节对齐存储。
谁能介绍下字节对齐的规则呢?
16的话,大概是因为lz的gcc默认是64位的编译吧,如果是64位的话,可以看一下int的字节数,应该是8吧,那当然是以8为模了 我的是32位的,所以对齐模数默认是4,12没有问题
arm指令是半字对齐的还是全字?
1、所谓对齐就是数据在存储器中存放的规则,32位系统中一般有字节对齐(8bit)、半字对齐(16bit)、字对齐(32bit)三种方式,分别对齐到连续地址、偶数地址、被4整除的地址。
2、arm体系结构中有ARM指令集和Thumb指令集2种,其中ARM指令为32位指令,按照4字节对齐存储,一条指令必须从4的整数倍地址来取;Thumb指令为16位指令,按2字节对齐存储,一条指令必须从偶数地址来取。 3、数据的存储:字符型数据一般为字节对齐存储、短整型按照双字节对齐存储、整型/浮点型按照4字节对齐存储。
arm指令采用什么对齐方式?
1、所谓对齐就是数据在存储器中存放的规则,32位系统中一般有字节对齐(8bit)、半字对齐(16bit)、字对齐(32bit)三种方式,分别对齐到连续地址、偶数地址、被4整除的地址。
2、arm体系结构中有ARM指令集和Thumb指令集2种,其中ARM指令为32位指令,按照4字节对齐存储,一条指令必须从4的整数倍地址来取;Thumb指令为16位指令,按2字节对齐存储,一条指令必须从偶数地址来取。
3、数据的存储:字符型数据一般为字节对齐存储、短整型按照双字节对齐存储、整型/浮点型按照4字节对齐存储。