内存对齐

来源:互联网 发布:java开发单元测试 编辑:程序博客网 时间:2024/04/30 05:53

1:数据成员对齐规则:
结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

结构体内的成员根据定义的顺序,依次在内存中占据自身字节大小整数倍的地址,以结构体首地址为参考(offset = 0)

#include <stdio.h>typedef struct {    char c[5];    int i;    double d;}data;int main(){    data d = {"c", 1, 3.14};    printf("&data.c = %p\n", &d.c);    printf("&data.i = %p\n", &d.i);    printf("&data.d = %p\n", &d.d);    printf("sizeof(data) = %d\n", sizeof(data));  //16    return 0;}

结构体中字符串c占了5个字节的,在对齐过程中空隔三个字节存放int
内存对齐地址

2:结构体作为成员:
如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储,即选择字节最大的进行对齐.)

#include <stdio.h>typedef struct {    char ch;    double in;}tmp;typedef struct {    char c;    tmp da;}data;int main(){    data d = {'c', 1, 3.14};    printf("&data.c = %p\n", &d.c);    printf("&data.i = %p\n", &d.da);    printf("sizeof(data) = %d\n", sizeof(data)); //24    return 0;}

内存对齐地址

3:收尾工作:
结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

4.取消内存对齐:

#pragma pack(1) //按一对齐,大小即为实际数据类型所占的内存空间

参考博文:博文链接 五分钟搞定内存对齐。

0 0
原创粉丝点击