内存对齐详解
来源:互联网 发布:淘宝图片怎么发链接 编辑:程序博客网 时间:2024/05/22 02:24
内存对齐详解
假设结构体存储下标从0开始的
先是按照#pragma pack(8)参数依次和数据成员比较:按照成员下标是比较结果中小者的倍数;
最后再按照#pragma pack(8)参数与结构体成员占空间最大者比较,结构体整体的长度是比较结果中小者的倍数;
1、分析说明:
字节对齐(#pragma pack(2))
输出结果:sizeof(structtest_t) = 10 [两个编译器输出一致]
分析过程:
1) 成员数据对齐
#pragmapack(2)
structtest_t {
int a; /* 长度4> 2 按2 对齐;起始offset=0 0%2=0;存放位置区间[0,3]*/
char b; /* 长度1< 2 按1 对齐;起始offset=4 4%1=0;存放位置区间[4]*/
short c; /* 长度2= 2 按2 对齐;起始offset=6 6%2=0;存放位置区间[6,7]*/
char d; /* 长度1< 2 按1 对齐;起始offset=8 8%1=0;存放位置区间[8]*/
};
#pragmapack()
成员总大小=9
2) 整体对齐
整体对齐系数=min((max(int,short,char), 2) = 2
整体大小(size)=$(成员总大小)按$(整体对齐系数)圆整= 10 /* 10%2=0 */
2、实际例子:
例子:
#include <stdio.h>#include <stdlib.h>#include <unistd.h> /*先是按照#pragmapack(2)参数依次和数据成员比较:按照两者之中小者对齐;最后再按照#pragmapack(2)参数与结构体成员占空间最大者比较,整体的长度是小者的倍数;*/#pragma pack(4)struct test_1 { inta; /* 长度4 =4 按4 对齐;起始offset=00%4=0;存放位置区间[0,3]*/ charb; /* 长度1 < 4 按1 对齐;起始offset=44%1=0;存放位置区间[4] */ shortc; /* 长度2 < 4 按2 对齐;起始offset=66%2=0;存放位置区间[6,7]*/ chard; /* 长度1 < 4 按1 对齐;起始offset=88%1=0;存放位置区间[8] */ /*整体要求:成员中占空间最大的与pack(4)比较,整体长度按照小者对其 目前整体length=9,而要求是4的倍数,因此结果需要是12 */};#pragma pack() #pragma pack(2)struct test_2 { inta; /* 长度4 > 2 按2 对齐;起始offset=0 0%2=0;存放位置区间[0,3] */ charb; /* 长度1 < 2 按1 对齐;起始offset=44%1=0;存放位置区间[4] */ shortc; /* 长度2 = 2 按2 对齐;起始offset=6 6%2=0;存放位置区间[6,7] */ chard; /* 长度1 < 2 按1 对齐;起始offset=88%1=0;存放位置区间[8] */ /*整体要求:成员中占空间最大的与pack(2)比较,整体长度按照小者对其 目前整体length=9,而要求是2的倍数,因此结果需要是10 */};#pragma pack() int main(int argc, char *argv[]){ printf("%d\n", sizeof(struct test_1)); printf("%d\n", sizeof(struct test_2)); return 0;}
3、sizeof()测试结果:
int (*ptr)[3]; //ptr代表指针,因此测得值为4
int *ptr[3]; //ptr代表数组名,每个成员是int * ,因此占3个*4=12
当ptr代表数组名时,测得是数组所占内存空间的大小
当ptr代表指针名时,测得是指针变量所占内存空间的大小
0 0
- 内存字节对齐详解
- 内存字节对齐详解
- 内存对齐详解
- C内存对齐详解
- 内存对齐详解
- 内存对齐详解
- C++内存对齐详解
- struct内存对齐 详解
- 内存对齐详解
- 内存对齐详解
- 内存字节对齐详解
- 内存对齐详解
- 内存字节对齐详解
- 内存对齐详解
- 内存对齐详解
- 内存对齐详解
- 【转载】内存对齐详解
- c++内存对齐详解
- 沿对角线填充矩阵
- Spring基于 Annotation 的简单介绍
- 《Linux内核设计与实现》读书笔记(十三)- 虚拟文件系统
- 最小生成树-Prim算法
- Java中的Condition --使线程间通信更高效
- 内存对齐详解
- 通过 Intent传递数据,并返回结果
- 【原创】关于联想Y400适配器和电池同时使用无法开机的问题
- 2. 算术运算
- 细说对象的相等性
- iOS获取设备剩余存储空间代码片段
- ASM--统计输入的字符个数,并输出
- Cocos2d-x 精灵移动
- 用python爬虫抓取韩寒的blog