内存对齐问题

1 为什么要进行内存对齐?

  ①不是所有的硬件平台都能访问任意地址上的任意数据的。
  ②为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。(即以空间换时间)

2 内存对齐的规则

2.1 应用对象

  联合体和结构体

2.2 规则

2.2.1 概念

  ①数据类型自身的对齐值:64位系统(windows 和 Linux)下char、short、int、float、double自身对齐值分别是1、2、4、4、8字节。
  ②结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。(如是数组只考虑变量类型)。
  ③指定对齐值:#pragma pack (value)时的指定对齐值value。没有指定为默认,Ubuntu 64位系统下为8。
  ③数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值

2.2.2 要求

  对齐指的是:每个成员相对于这个结构体的偏移量是该成员类型有效对齐值的整数倍;结构体占用的字节数是其有效对齐值的整数倍。

3 具体判断方法

#include <stdio.h>
typedef union
{
	short i;
	int k[5];
	char c[3];
}Mat;

typedef struct
{
	int i;
	Mat j;
	double k;
}Like;



void main(void)
{
	printf("%ld\r\n", sizeof(Mat)+sizeof(Like));
}

  ①联合体大小Mat为自身最大数据大小,即20,且20/4=5(4为有效对齐值),满足联合体大小原则。
  ②结构体Like的大小为:i占4个字节,未补齐时j变量的偏移值为4,4(偏移值)/4(有效对齐值)=1,能整除,所以不用补齐。Mat的大小为20个字节。未补齐时k变量的偏移值为24,24/8=3,所以不用补齐。所以整体大小为4+20+8=32个字节。32/8=4,满足结构体大小原则。
  ③两者相加的大小为32+20=52个字节。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值