1. 关于c语言中的结构体字节对齐
仔细看一下书中的说明吧,这三言两语介绍起来有点累
或从网上查阅相关的技术资料,有详细描述。
一般简单来说,结构体从第一个变量开始检查空间的“对齐字节数”,
默认以第一个字节大小作为对齐字节数,如果遇上的下一个字节与当前对齐字节数不同时,就按两者中较大的来进行结构体空间分配,接下来的对齐就全按此值来对齐,直到再遇上不同的才进行检查或改变。
2. c语言,怎么解决结构体字节对齐问题或者说是否有一个函数能使未知结构体转换成一字节对齐的字节数组
结构体中多定义一个无关的数据类型,这个数据类型的长度要和原有长度构成结构体的对齐
3. C语言字节对齐
应该是把A当成了 char 和 int 类型来进行对齐吧
4. C语言字节对齐怎么操作
成为一名合格的IT人才
5. 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()相关的资料的,就会清楚了。
6. 什么是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)指定结构体字节对齐的话,后面的方式移植到其它系统可能会出现死机问题。
7. C语言字节对齐问题
这个占多少个字节是不确定的!!!跟编译器有关的!!
对于visual
c++来说:
int
4字节
char
1字节
float
4字节
long
4字节
double
8字节
而对于gcc的编译器来说
double占12字节!
8. 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字节对齐
9. C语言有关内存对齐的问题
//比如有这样的结构体
structA
{
chara;//占1个字节
intb;//占4个字节
};
//那这个结构体一共要占5个字节的内存吗?
//不是的,系统会把它填充成8个字节,这就是字节对齐
//那系统为什么要这样做呢,这涉及到存取的效率问题
//从硬件角度看,32位的CPU通过总线访问内存,一个总线周期访问32位内存数据
//刚刚好4个字节,所以4字节对齐的存取效率是较高的
//这就是牺牲空间换取效率了
//当然不对齐CPU也能访问,就是要花点功夫而已
10. 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个字节,后面的再继续这个过程