struct 内存对齐规则
来源:互联网 发布:登陆舰升级数据 编辑:程序博客网 时间:2024/05/21 18:22
struct 内存对齐规则
原文地址:http://blog.csdn.net/u012513234/article/details/40783597
1 确定数据成员的offset地址
A-----基本数据类型(不包括数组/struct/class/uinon),起始offset地址,规律如下,sizeof(atom_type)*N (N=0,1,2,3..)
例子:char 0,1,2,3... int 0,4,8,12... double 0,8,16,24...
B-----组合数据成员(数组/struct/class/uinon ),,起始offset地址,规律如下,sizeof{max(atom_type)}*N (N=0,1,2,3...) 也就是成员的子成员中最大的那个,说到底还是依赖于基本数据类型的大小(找到它的所有基本类型,选出最大的)。
例子:char ch[5]; 0,1,2,3... strcut ss{int var1;double var2}; 0,8,16,24...
2 计算最终的大小,sizeof() 的时候,内部最大成员的"最宽基本类型成员"的整数倍,不足补齐,
原文地址:http://blog.csdn.net/u012513234/article/details/40783597
1 确定数据成员的offset地址
A-----基本数据类型(不包括数组/struct/class/uinon),起始offset地址,规律如下,sizeof(atom_type)*N (N=0,1,2,3..)
例子:char 0,1,2,3... int 0,4,8,12... double 0,8,16,24...
B-----组合数据成员(数组/struct/class/uinon ),,起始offset地址,规律如下,sizeof{max(atom_type)}*N (N=0,1,2,3...) 也就是成员的子成员中最大的那个,说到底还是依赖于基本数据类型的大小(找到它的所有基本类型,选出最大的)。
例子:char ch[5]; 0,1,2,3... strcut ss{int var1;double var2}; 0,8,16,24...
2 计算最终的大小,sizeof() 的时候,内部最大成员的"最宽基本类型成员"的整数倍,不足补齐,
例子 struct a{int a;double d;} 最宽基本数据类型成员大小为8,则a的大小只能是8的倍数。
#include "stdafx.h"#include <iostream>#include <stdlib.h>using namespace std;//author: horizon//date:2014年11月4日 13:22:58struct C{double C_d; //第2.3.1 数据类型为double,地址为32-39char C_char; //第2.3.2 数据类型为char,地址为40-41int C_int; //第2.3.3 数据类型为int,地址为4的倍数,地址为44-47}; struct B { char B_array[5]; //第2.1步: B_array的地址确定为16-20 int B_int; //第2.2步: 数据类型为int,地址为4的倍数,地址为24-27 C B_C; //第2.3步, C的基本数据类型(double char)中最大的为double,B_C的起始地址为8的倍数,起始地址为32 };struct A{ char A_ch[9]; //第一步:确定A_ch起始地址为0,占用地址0-8B A_B; //第二步:确定A_B的基本数据类型(char int double)最大为double,则B的起始地址为8的倍数,只能是16了,double A_d; //第三步:在2.3.3确定的47的基础上,8的倍数,地址范围为48-55char A_char; //第四步:地址为56-57}; //根据sizeof规则,sizeof(A)为8的倍数,sizeof(A)=64>=57; A的地址范围0-63 int _tmain(int argc, _TCHAR* argv[]){struct A a; cout<<"sizeof(a): "<<sizeof(a)<<endl; cout<<"A_ch 起始地址:"<<(char *)&a.A_ch[0]-(char *)&a<<endl; cout<<"A_B 起始地址:"<<(char *)&a.A_B-(char *)&a<<endl; cout<<" B_array 起始地址:"<<(char *)&a.A_B.B_array[0]-(char *)&a<<endl; cout<<" B_int 起始地址:"<<(char *)&a.A_B.B_int-(char *)&a<<endl; cout<<" B_C 起始地址:"<<(char *)&a.A_B.B_C-(char *)&a<<endl; cout<<" C_d 起始地址:"<<(char *)&a.A_B.B_C.C_d-(char *)&a<<endl; cout<<" C_char 起始地址:"<<(char *)&a.A_B.B_C.C_char-(char *)&a<<endl; cout<<" C_int 起始地址:"<<(char *)&a.A_B.B_C.C_int-(char *)&a<<endl; cout<<"A_d 起始地址:"<<(char *)&a.A_d-(char *)&a<<endl; cout<<"A_char 起始地址:"<<(char *)&a.A_char-(char *)&a<<endl; system("pause");return 0;}
如果任何错误的地方请指出,谢谢。
0 0
- struct 内存对齐规则
- Struct 内存计算 对齐规则
- C语言中内存对齐规则讨论(struct)
- C语言中内存对齐规则讨论(struct)
- C语言中内存对齐规则讨论(struct)
- struct union 内存对齐
- (Struct)内存对齐
- struct 内存对齐
- struct内存对齐 详解
- union struct 内存对齐
- struct内存对齐
- (Struct)内存对齐
- struct内存对齐
- struct内存对齐
- struct/union内存对齐
- struct内存对齐
- struct内存对齐
- C++ struct内存对齐
- OpenCL编程入门(一)
- Android Support v4、v7、v13的区别和应用场景
- Java.lang.IllegalArgumentException: Unknown entity:
- 斯坦福大学iOS应用开发教程学习笔记(第一课)MVC.and.Introduction.to.Objective-C
- hadoop2升级的那点事情(详解)
- struct 内存对齐规则
- DTW算法时序应用与实现
- 遍历Lua全局环境变量
- 【剑指Offer】赋值运算符函数
- eclipse安装SVN插件的两种方法
- 矢量图层标注
- maven 命令总结(持续更新)
- apache服务器的安装
- centos搭建虚拟pptp