设为首页 加入收藏

TOP

C/C++之内存对齐详情
2017-12-18 12:36:36 】 浏览:158
Tags:C/C 内存 详情

1、什么是内存对齐

计算机系统对基本类型数据在内存中放的位置做了限制,它们会要求这些数的首地址是一个数(一般为4和8)的整数倍,我们看下结构体的大小

#include 
  
   
struct A
{
    char a;
    int b;
};

int main()
{
    printf("size of struct A is %d\n", sizeof(struct A));
    return 0;
}
  
结果:

1111deMacBook-Pro:digui a1111$ ./sizeof
size of struct A is 8
结果是8,不是5,是由于内存对齐导致

1:a

2

3

4

5:b

6

7

8

2、为什么要内存对齐

牺牲了空间,加快cpu寻址速度,加快读取内存数据速度。

内存是以字节为单位,但处理器不是以字节块来存取,一般用双字节,四字节,8字节,16字节,或者32字节来存取内存,这些存取单位为内存存取粒度

比如没有内存对齐,用4字节存取粒度, int变量放在地址为1的地方,我们从0地址开始读区数据,第一个读区范围是0到4,但是这事后没有读完,有效地址还有,4到5,然后第二次,读区从4到8,然后把2块有效数据合并放入寄存器,需要做很多工作,如果有内存对齐,从0地址开始存储,可以一次性读完,不需合并数据,所以加快了效率,

3、用#pragma pack(n)对内存不对齐

加入内存对齐

#include 
  
   
struct A
{
    int a;
    char b;
    char c;
};

struct B
{
    char a;
    int b;
    char c;
};
int main()
{
    printf("size of struct A is %d\n", sizeof(struct A));
    printf("size of struct B is %d\n", sizeof(struct B));
    return 0;
}
  
结果分别是:

8 12

然后用#pragma pack(n)处理内存不对齐,比如我们用#pragma pack(1)

#include 
  
   

#pragma pack(1)
struct A
{
    int a;
    char b;
    char c;
};

struct B
{
    char a;
    int b;
    char c;
};
int main()
{
    printf("size of struct A is %d\n", sizeof(struct A));
    printf("size of struct B is %d\n", sizeof(struct B));
    return 0;
}
  
结果都是

6 6

如果用#pragma pack(2)
结果就是

6 8

我们可以这样理解,pack(n),结构体的成员变量的首地址可以是n倍的开头

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言文件操作:文件打开方式详解 下一篇c语言指针基础之指针的基本概念

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目