当前位置: 移动技术网 > IT编程>开发语言>JavaScript > C/C++之内存对齐详情

C/C++之内存对齐详情

2017年12月18日  | 移动技术网IT编程  | 我要评论
1、什么是内存对齐 计算机系统对基本类型数据在内存中放的位置做了限制,它们会要求这些数的首地址是一个数(一般为4和8)的整数倍,我们看下结构体的大小 #include
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倍的开头

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网