c语言的字节对齐
① c语言结构体怎么对齐按最大字节对齐struct pp{int a;float b; doubl
24(按8字节对齐,前面int和float合起来刚好8字节+double8字节+char补齐后8字节=24)
如果是struct pp{int a;float b; char d}oo; sizeof(oo)就是12字节,按4字节对齐
② C语言字节对齐怎么操作
成为一名合格的IT人才
③ 关于C语言中的结构体字节对齐
仔细看一下书中的说明吧,这三言两语介绍起来有点累
或从网上查阅相关的技术资料,有详细描述。
一般简单来说,结构体从第一个变量开始检查空间的“对齐字节数”,
默认以第一个字节大小作为对齐字节数,如果遇上的下一个字节与当前对齐字节数不同时,就按两者中较大的来进行结构体空间分配,接下来的对齐就全按此值来对齐,直到再遇上不同的才进行检查或改变。
④ 什么是C语言结构体字节对齐,为什么要对齐
对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。
需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据,如果变量在0x00000003地址上的话则要访问三次内存,第一次为char,第二次为short,第三次为char,然后组合得到整型数据。而如果变量在自然对齐位置上,则只要一次就可以取出数据。一些系统对对齐要求非常严格,比如sparc系统,如果取未对齐的数据会发生错误,举个例:
char ch[8];
char *p = &ch[1];
int i = *(int *)p;
运行时会报segment error,而在x86上就不会出现错误,只是效率下降。
⑤ C语言字节对齐问题
看样子跟你用的编译器有关系,
你用的是gcc 什么版本的,最新的是4.9吧
⑥ c语言如何分配16字节对齐空间,共计1024字节
structblock16
{
chardata[16];
};
structblock16*p=(structblock16*)malloc(1024);
⑦ C语言里面的字节对齐的计算方法能讲解1下吗
首先你要知道为什么会出现字节对齐,这是一种用空间换时间的做法,因为对齐之后可以提高取数的效率。结构体的大小一般是4或者8的倍数,具体是以最大的变量类型的大小为基数的。也就是说在内存中,数据一般是放在一个4的整数倍的起始地址。
sturct S
{
char c;
short s;
int i;
}
它的大小是8个字节,因为前面两个占了4字节。如果写成下面这种形式,它就是12字节了
struct S
{
char c;
int i;
short s;
}
因为为了提高存取效率,所以第一个成员变量占了四个字节的空间,最后一个成员也占了四个字节
你非要说计算方法的话要根据具体情况来算了,首先看结构体中哪一个变量所占的字节数最大,然后后面的对齐计算都以这个为基数(我这里以4字节为例)。接着,你把每一个成员变量的大小依次相加(按照结构体定义中的顺序,从第一个加到最后一个)。当你加到某一个变量的时候,发现超过了4个字节,那么就把这个变量之前的内容当作是一个整体,它们一共点4个字节,后面的再继续这个过程
⑧ C语言的字节对齐问题
问题没说清,不过一般对齐方面都是指方便阅读程序。一种不成文的规范
⑨ C语言结构体长度字节对齐问题
因为当结构体中有多个数据类型时,结构体的长度对齐是按数据类型长度最长的那个来对齐的,double类型占8个字节,所以每个成员变量都按8个字节的长度来算,就是5*8=40,验证程序如下:
#include<stdio.h>
structchji
{
charname[9];
intnumber;
charsex;
doublescore;
floataa;
};
structchjistu;
intmain()
{
printf("sizeof(structchji)=%d ",sizeof(structchji));
return0;
}
运行结果:sizeof(struct chji)=40
如果要按单个字节的长度来对齐的话,代码如下:
#include<stdio.h>
#pragmapack(1)
structchji
{
charname[9];//9
intnumber;//4
charsex;//1
doublescore;//8
floataa;//4
};
structchjistu;
#pragmapack()
intmain()
{
printf("sizeof(structchji)=%d ",sizeof(structchji));
return0;
}
运行结果:sizeof(struct chji)=26
即9+4+1+8+4=26,你可以查下#pragma pack()相关的资料的,就会清楚了。
⑩ C语言字节对齐
应该是把A当成了 char 和 int 类型来进行对齐吧