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语言结构体怎么对齐按最大字节对齐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语言结构体对齐的问题。
这是个好问题!
为什么会有对齐的问题呢?简单的说就是为了提高访问内存的效率,这和CPU内部的机制有关,如果你想深入理解,需要阅读 Intel 开发者手册。对齐采用的总体原则是这样的:4字节变量的存放要对齐到可以被4整除的地址上,8字节变量的存放要对齐到可以被8整除的地址上。其他变量类推就行了。如果没对齐编译器就会将某个变量的存储往后推迟几个字节,以保证对齐后再存放。
具体到这个问题就是可以先假设结构体变量从地址0处开始存放,那么第一种情况就是这样的了:
cat 存放的位置是地址0-地址3
a数组存放的位置是地址4-地址23
dog存放的位置是地址24到地址31
这里可以看到它们都符合对齐的原则(即每个变量开始存放的地址可以除尽它们所占的字节数),所以是32
第二种情况是这样的:
cat仍然存放到地址0-地址3处
a数组是地址4到地址27处
存放dog时编译器计算除下一个地址28并不能除尽double的字节数8,于是它要将地址进行递增。29,30,31仍然不能除尽8,知道递增到32时可以将8除尽了,所以dog变量会被存放在地址32到地址39处,从地址0到地址39正好40个字节,这就解释了第二种情况了。
ps. 其实你这个问题还有一种变种就是一个结构体里在套一个结构体,这时会牵扯到内部的结构体对齐的问题。等你以后遇见了再给我提问吧,我给你解释。
㈣ 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语言中的结构体字节对齐
仔细看一下书中的说明吧,这三言两语介绍起来有点累
或从网上查阅相关的技术资料,有详细描述。
一般简单来说,结构体从第一个变量开始检查空间的“对齐字节数”,
默认以第一个字节大小作为对齐字节数,如果遇上的下一个字节与当前对齐字节数不同时,就按两者中较大的来进行结构体空间分配,接下来的对齐就全按此值来对齐,直到再遇上不同的才进行检查或改变。
㈦ C语言里,联合体要不要像结构体一样对齐如果要,是几的倍数
也要对齐。首先,联合体要能容纳其中最大的元素;然后,联合体的对齐字节数要跟内部元素的最大对齐字节数一致。
例如,联合体中含有以下几个元素:
union
example
{
char
a;
int
b;
double
c;
struct
d
{
int
x;
int
y;
int
z;
};
};
1.
联合体要能容纳struct
d,因为d是12字节,所以联合体的大小要大于等于12。
2.
联合体的对齐要以double
c为准,因为c是8字节对齐的,最长。
所以最终,联合体的大小是16个字节。
㈧ C语言问题
这是结构体字节对齐的问题!
struct student
{
int num; //占4字节
float score; //占4字节
char a; //占1个字节,为了读取方便,后面补充了3个无效的字节
struct student *aaa; //占4个字节
};
struct student
{
int num; //占4字节
float score; //占4字节
char a; //占1个字节,
char b; //占1个字节,为了读取方便,后面补充了2个无效的字节
struct student *aaa; //占4个字节
};
因此,加不加char b,他们占用的字节数量是一样的
㈨ 在arm中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)指定结构体字节对齐的话,后面的方式移植到其它系统可能会出现死机问题。