C/C++语言中struct结构体定义中__packed的作用是什么?

作者&投稿:仇届 (若有异议请与网页底部的电邮联系)
结构体定义后加PACKED,是什么意思?请教。~

这个你不用思考了~想不通的

__packed是字节对齐的意思。

比如说int float double char它的总大小是4 + 4 + 8 + 1 = 17
但如果你不用__packed的话,系统将以默认的方式对齐(假设是4字节),那么它占4 + 4 + 8 + 4 = 20;(不足4字节以4字节补齐)。
但在VS2008上述方法不能用了(低版本我没有试过),如果想设置对齐方式,只要选择工程属性-配置属性-C/C++-代码生成就能设置,它的选项有1、2、4、8、16。在GCC下,可以在加上#pragma pack(4) 4字节对齐的意思,其它同理。

1、__packed是字节对齐的意思。
比如说int
float
double
char它的总大小是4
+
4
+
8
+
1
=
17
但如果不用__packed的话,系统将以默认的方式对齐(假设是4字节),那么它占4
+
4
+
8
+
4
=
20;(不足4字节以4字节补齐)。
2、在VS2008上述方法不能用了,如果想设置对齐方式,只要选择工程属性-配置属性-C/C++-代码生成就能设置,它的选项有1、2、4、8、16。在GCC下,可以在加上#pragma
pack(4)
4字节对齐的意思,其它同理。

packed是字节对齐的意思。

比如说int float double char它的总大小是4 + 4 + 8 + 1 = 17

但如果不用__packed的话,系统将以默认的方式对zhidao齐(假设是4字节),那么它占4 + 4 + 8 + 4 = 20;(不足4字节以4字节补齐)。

各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。

扩展资料:

其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。

3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。





这个你不用思考了~想不通的

__packed是字节对齐的意思。

比如说int float double char它的总大小是4 + 4 + 8 + 1 = 17
但如果你不用__packed的话,系统将以默认的方式对齐(假设是4字节),那么它占4 + 4 + 8 + 4 = 20;(不足4字节以4字节补齐)。
但在VS2008上述方法不能用了(低版本我没有试过),如果想设置对齐方式,只要选择工程属性-配置属性-C/C++-代码生成就能设置,它的选项有1、2、4、8、16。在GCC下,可以在加上#pragma pack(4) 4字节对齐的意思,其它同理。

1、__packed是字节对齐的意思。
比如说int float double char它的总大小是4 + 4 + 8 + 1 = 17
但如果不用__packed的话,系统将以默认的方式对齐(假设是4字节),那么它占4 + 4 + 8 + 4 = 20;(不足4字节以4字节补齐)。
2、在VS2008上述方法不能用了,如果想设置对齐方式,只要选择工程属性-配置属性-C/C++-代码生成就能设置,它的选项有1、2、4、8、16。在GCC下,可以在加上#pragma pack(4) 4字节对齐的意思,其它同理。

用于内存对齐的,有些地方处理内存是按照一定长度作为单位的,如果你的结构体刚好不是最小单位的整数倍,你就可以用这个函数来声明自动对齐,不足的也占位

编译如果不通过,这个首先要看你的编译器是否支持,如果支持,不同编译器的格式也有点不同,你要看编译器的文档具体是如何定义和使用的 。
一般有这样的
typedef __packed struck test_s
{
...
}test_t;

还有这种样子的
typedef struck __attribute__((packed)) test_s
{
...
}test_t;
其实__packed或者__attribute__((packed))关键字的作用就是用来打包数据的时候以1来对齐,你比如说用来修饰结构体或者联合体的时候,那么这些成员之间就没有间隙(gaps)了。如果没有加,那么这样结构体或者联合体就会以他的自然对齐方式来对齐。比如某CPU架构的编译器默认对齐方式是4, int的size也是4,char的size是1,那么类似
typedef __packed struck test_s
{
char a;
int b;
}test_t;
这样定义的结构体的size就是8个字节了。
如果加上packed,size就会变成5个字节,中间是没有gaps的。


鲅鱼圈区19514557110: C语言中,struct用什么来定义? -
贲羽养阴: struct是一种类型(结构体类型)与int、float一样的,它是为了解决C语言类型单调而设计的.在它里面可以出现int、string类型等C语言类型.使用它不需要定义,常常用它定义结构体.如定义一学生结构体: struct students {int age;int Number;char name[20]; } 还可以通过结构体建立C语言的灵魂——链表 如:struct student {int data; struct student *next; }

鲅鱼圈区19514557110: c++参数传递#include"iostream.h"struc
贲羽养阴: 参数的传递分三种: 1)值传递 2)地址传递:指针传递和引用传递. 值传递不会改变实参本身,而地址传递就会改变实参,因为他传递过去的是存储这个变量的地址. ...

鲅鱼圈区19514557110: C的结构(struct)和C中的结构有什么分别?C的结构(str
贲羽养阴: 在C和C++中 struct是不同的. 区别就是: 在C中struct 内部只能有各种数据, 在C++中struct 可以有数据,有函数. 例如 在C中如下是正确的: struct MyStruct { int i; char* ...

鲅鱼圈区19514557110: C++里面的struct与C里面的struct有何不同? -
贲羽养阴: C++中的STRUCT可以有成员函数(方法),但是C不能有,例如下面的结构体:#include <stdio.h> struct SAMPLE { int a,b,c; void Set(int x,int y,int z){a=x;b=y;c=z;} char*toStr(){char p[20]={0};sprintf(p,"%d %d %d",a,b,c);return p;} }; 调用:...

鲅鱼圈区19514557110: C++中的结构体struct定义 -
贲羽养阴: 这里dwValue1:31,表示占32个bit中的31位,而dwValue2:1,表示占32个bit中的最低位bit.这样这两个成员变量总共只占一个双字节32bit.这样写的往往用来网络字节编程中,比如IP/TCP等的包头的字段定义,可以节省字节.比如IP包头的版本就只占几个bit,就是这样写的.

鲅鱼圈区19514557110: c++ set 集合 -
贲羽养阴: #include using namespace std;typedef struct STRUC{ int x; int y;}STRUCT;int main(){ STRUCT struc1, struc2, struc3; struc1.x = 1; struc1.y = 2; struc2.x = 3; struc2.y = 4; struc3.x = 5; struc3.y = 6; long add1 = (long)&struc1; long add2 = (long)&struc2; ...

鲅鱼圈区19514557110: C++的struct,enum,union与C语言有何区别? -
贲羽养阴: enum是枚举,就是某个变量的值是能够列举的,比如,星期的话就每周1到7,月的话就1到12、而struct的话是对于某个变量是有很多数据类型构成一个总体的,比如学生这个变量,他需要学号,姓名,年龄,性别等等,这个时候就需要定义结构体了.而uninon的话呢,其中定义的变量都只占一个内存...

鲅鱼圈区19514557110: C语言#include<string.h>struc
贲羽养阴: *p->name是取出了temp.name里的第一个字符,也就是"Casanova"里的"C",然后,"C"+2也就是先把"C"转成ascii码,然后加2,再用字符输出,也就得到了大写E 同理,*(p->name+2)取出的是temp.name里的第三个字符(p->name是指向"C"的地址,+2的话就是再向后偏移两个地址),所以就是"s" #include 是导入头文件,使得在文件string.h中的strcpy()函数可用,在这里,该函数的作用是把一个String复制给一个char数组

鲅鱼圈区19514557110: 是什么意思c语言中structpt100 - ?c语言中struc
贲羽养阴: 这是一个结构体的数组,表示pt是一个结构体数组,数组内元素都是结构体类型的.

鲅鱼圈区19514557110: C语言中字符串函数声明
贲羽养阴: 让我来告诉你答案!在头文件string.h中,把这个头文件加进来就行了如果要自己写这些函数的话,那就只能是#include...在这声明一下;&#47;&#47;只写函数的返回值类型,函数名,参数类型,参数main(){...}你的子函数;...就是这样形式了,怎么实现就不知道了

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网