c语言中struct的内存对齐】的更多相关文章

为了让CPU能够更舒服地访问到变量,struct中的各成员变量的存储地址有一套对齐的机制.这个机制概括起来有两点:第一,每个成员变量的首地址,必须是它的类型的对齐值的整数倍,如果不满足,它与前一个成员变量之间要填充(padding)一些无意义的字节来满足:第二,整个struct的大小,必须是该struct中所有成员的类型中对齐值最大者的整数倍,如果不满足,在最后一个成员后面填充. 各种类型的变量的align值如下,参考的是wikipedia的页面:------------------------…
很少有人谈起struct的内存对齐问题, 就是在很多C#书中, 也很少提及. 但在实际应用中, 如果不注意内存对齐, struct比较大的话, 则会浪费一定的内存.    先从一个实例看起. public unsafe struct MyStruct1 {  byte b;  string s;  int i;  char c; }    在这个struct中, 各个成员的字节数为, b:1, s:4, i:4, c:1. s为指针, 所以为4个字节. 把这些成员的字节数加起来应该为10个字节,…
struct 结构体 对于复杂的数据类型(例如学生.汽车等),C 语言允许我们将多种数据封装到一起,构成新类型. 跟面向对象语言中的对象相比,结构体只能包含成员变量,不支持操作. #include <stdio.h> #include <string.h> struct People { int age; char name[100]; // 这里如果用指针,下面用 strcpy 赋值时会报段错误 }; // 分号必须有 int main() { struct People p =…
C++中的struct已经和class一样,可以用构造函数初始化. C语言中的struct怎么初始化呢? typedef struct _TEST_T {        int i;        char c[10];}TEST_T; TEST_T gst  = {1, “12345”};//可以初始化,设置i为1,s为一个字符串. TEST_T gst  = {1};//初始化个数少于实际个数时,只初始化前面的成员. TEST_Tgst  = {.c=“12345”};//有选择的初始化成员…
在C语言的结构体中,是会按照其变量类型来进行分配内存大小的.但是对于不同的编译器,结果是不同的,在VC++6.0中是怎么个分配情况呢?用一下C中的关键字sizeof()来测试下,注意sizeof()不是函数哦!只是关键字而已.下图就是在VC++6.0中的字节分配情况: 下面来分析一下,C中结构体中成员变量的写法,对占用内存的影响. 却发现结果不是13个字节?却是24个字节?为什么呢?哦!肯定是编译起的问题,对,没错,就是编译器的问题,VC++6.0是按照8个字节来对齐的,只要不满足或者暂时不满足…
说明:如果你看到了这篇,请略过. struct是复合类型. 其中的成员在内存中的分布都是对齐的. 这个对齐的意思是,struct的sizeof运算结果必定是其最大类型长度的整数倍. --注意,如果struct内部还有struct的话,应该将内部struct的成员拆开来看.而不应将内部struct看成一个整体成员(该角度仅限于size上). 由于对齐的原则,成员的顺序会涉及到整体的内存占用. 极其特别的,C支持对struct中的成员指定占用的bit数(注意,是bit,不是byte)--不能超出类型…
位域的定义和使用 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”.所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作. 这样就可以把几 个不同的对象用一个字节的二进制位域来表示. 一.位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:  s…
转1个写的比较全面的. http://hubingforever.blog.163.com/blog/static/17104057920122256134681/ 本文编辑整理自:http://hi.baidu.com/pine515/blog/item/28f41f496042e8ee83025c4e.htmlhttp://blog.sina.com.cn/s/blog_4913c1f301000bip.html一. ANSI C标准中并没有规定,相邻声明的变量在内存中一定要相邻.,,.而且…
struct内存对齐:gcc与VC的差别 内存对齐是编译器为了便于CPU快速访问而采用的一项技术,对于不同的编译器有不同的处理方法. Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则: 任何基本数据类型T的对齐模数就是T的大小,即sizeof(T).比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始.Linux下的GCC奉行的是另外一套规则:任何2字节大小的数据类型(比如short)的对齐模数是2,而其它所有…
原文链接:http://www.cnblogs.com/Miranda-lym/p/5197805.html struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括stru…