本文目录一览:
关于C语言中的结构体字节对齐
仔细看一下书中的说明吧,这三言两语介绍起来有点累
或从网上查阅相关的技术资料,有详细描述。
一般简单来说,结构体从第一个变量开始检查空间的“对齐字节数”,
默认以第一个字节大小作为对齐字节数,如果遇上的下一个字节与当前对齐字节数不同时,就按两者中较大的来进行结构体空间分配,接下来的对齐就全按此值来对齐,直到再遇上不同的才进行检查或改变。
什么是C语言结构体字节对齐,为什么要对齐
arm支持16bit和32bit的地址访问,即变量地址能够被2或4整除,这时性能比较好,也便于移植。结构体的对齐就是指的结构体内部的每个成员变量地址尽可能对齐到2或4字节位置,如定义为:
struct{
char
ch1;
char
ch2;
short
ss;
int
i;
}var;
字符变量ch1,
ch2为字节对齐,短整型变量ss为半字对齐,整型变量i为字对齐,结构体内的变量比较紧凑,且已自然对齐,结构体变量var占用总空间为8个字节。如果改为这样:
struct{
char
ch1;
short
ss;
char
ch2;
short
ss;
int
i;
}var;
var变量最终占用的空间为12个字节,存取这个结构体时比前面那个需要的时间要多,另外如果用pack(1)指定结构体字节对齐的话,后面的方式移植到其它系统可能会出现死机问题。
C语言字节对齐问题
目前编译器上(我是说visual c++)如果没有特别设置的话, 默认的对齐方式按下面几个规律
1. 每个成员对齐到它长度的整数倍
2. 整个结构的长度对齐到它最长成员长度的整数倍
3. 上面所说的长度,超过4的按4算。
就这个来说, b字段会被对齐到2字节位置, 最后整个会被对齐到6字节长
我不知道这几点是标准还是实现, 以后会不会有变化
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语言结构体长度字节对齐问题
因为当结构体中有多个数据类型时,结构体的长度对齐是按数据类型长度最长的那个来对齐的,double类型占8个字节,所以每个成员变量都按8个字节的长度来算,就是5*8=40,验证程序如下:
#include stdio.h
struct chji
{
char name[9];
int number;
char sex;
double score;
float aa;
};
struct chji stu;
int main()
{
printf("sizeof(struct chji)=%d\n",sizeof(struct chji));
return 0;
}
运行结果:sizeof(struct chji)=40
如果要按单个字节的长度来对齐的话,代码如下:
#include stdio.h
#pragma pack(1)
struct chji
{
char name[9]; //9
int number; //4
char sex; //1
double score; //8
float aa; //4
};
struct chji stu;
#pragma pack()
int main()
{
printf("sizeof(struct chji)=%d\n",sizeof(struct chji));
return 0;
}
运行结果:sizeof(struct chji)=26
即9+4+1+8+4=26,你可以查下#pragma pack()相关的资料的,就会清楚了。