Java教程

内存对齐

本文主要是介绍内存对齐,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

内存对齐的原因:

  • 以空间换时间

对于自定义数据类型对齐规则:

  • 从第一个属性开始 偏移为0
  • 第二个属性开始,地址要放在 该类型整数陪 与 对齐模数比 取小的值 的整数陪上
  • 所有的属性都计算结束后,整体再做二次对齐,整体需要放在属性中做大类型 与 对齐模数比 取小的值的整数倍上

如何查看对齐模数

  • #pragma pack(show)
  • 默认对齐模数 是8,可以将对齐模数改为 2的n次方

当结构体嵌套结构体时候,只需要看结构体中最大数据类型就可以了

代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#pragma pack(show)//可以查看对齐模数
//#pragma pack(1)//默认对齐模数为8    对齐模数可以改为 2的次方
//对于自定义数据类型   内存对齐规则如下
//1.从第一个属性开始   偏移为0
//2.第二个属性开始,地址要放在        该类型整数陪   与 对齐模数比  取小的值  的整数陪上
//3.所有的属性都计算结束后,整体再做二次对齐,整体需要放在属性中做大类型 与 对齐模数比 取小的值的整数倍上
typedef struct _STUDENT
{
        int a;//0~3            
        char b;//4~7
        double c;//8~15
        float d;//16~19
}Student;
void test01()
{
        printf("size of=%d\n",sizeof(Student));
}
//当结构体嵌套结构体时候,只需要看结构体中最大数据类型就可以了
typedef struct _STUDENT2
{
        char a;//0~7
        Student b;     //8~31
        double c;      //32~39
}Student2;
void test02()
{
        printf("size of=%d\n", sizeof(Student2));
}
int main()
{
        //test01();
        test02();
        return EXIT_SUCCESS;
}
这篇关于内存对齐的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!