sizeof与内存对齐
来源:互联网 发布:c语言计算闰年switch 编辑:程序博客网 时间:2024/06/05 14:20
sizeof
内存对齐三原则:
- 第一个数据从0开始,以后每个数据要从他本身大小的整数倍开始存;
- 如果这个数据是个结构体或者数组,则从其最大元素的整数倍开始存;
- 最后收尾要是最大成员的整数倍,不足补齐;
对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量) Char 偏移量必须为sizeof(char)即1的倍数 int 偏移量必须为sizeof(int)即4的倍数 float 偏移量必须为sizeof(float)即4的倍数 double 偏移量必须为sizeof(double)即8的倍数 Short 偏移量必须为sizeof(short)即2的倍数
typedef struct bb{ int id; //[0]....[3] double weight; //[8].....[15] 原则1 float height; //[16]..[19],总长要为8的整数倍,补齐[20]...[23] 原则3}BB;typedef struct aa{ char name[2]; //[0],[1] int id; //[4]...[7] 原则1 double score; //[8]....[15] short grade; //[16],[17] BB b; //[24]......[47] 原则2}AA;
sizeof结果分别是24和48
加入#pragma pack
加上#pragma pack(n)后,对齐时就选择n和数据大小两者中最小的那个作为对齐的规则,条件三也不需要了。
sizeof与strlen的区别
int h = sizeof("abcde");int t = strlen("abcde");
其中,h为6,t为5.
sizeof计算字符串与指针
string s = "hellohwc"; char * s1 = "hellohwc"; char s2[] = "hellohwc"; char s3[100]; char* s4=(char*)malloc(100); void *s5=(void*)malloc(100); cout<<sizeof(s)<<endl; cout<<sizeof(s1)<<endl; cout<<sizeof(s2)<<endl; cout<<sizeof(s3)<<endl; cout<<sizeof(s4)<<endl; cout<<sizeof(s5)<<endl; return 0;
输出:32(?)、4、9、100、4、4
- 对于s1是指向字符串常量的指针,在32位机器上指针是4个字节,因此输出为4;
- 对于s2是一个数组名,数组名做参数本应该作为指针来处理,但是sizeof和&是特殊情况,sizeof对数组名而言,返回整个数组的长度,因此输出为9,为9是因为8个字符加上一个空字符;
- s3和s2分析方法相同,输出为100;
- s4和s5都是指针,不管是什么类型的指针,都是保存了一个地址,在32位的机器上,4GB的寻址空间需要32位,也就是4个字节来保存,因此s4和s5输出都是4
sizeof计算类
#include "stdafx.h" #include <iostream> #include <string> using namespace std; class emptyClass1{ public: emptyClass1(){} ~emptyClass1(){} }; class emptyClass2{ public: emptyClass2(){} virtual ~emptyClass2(){} }; class hwcBase{ public: hwcBase(){} virtual ~hwcBase(){} private: int base; }; class hwcSubFirst:hwcBase{ public: hwcSubFirst():hwcBase(){} ~hwcSubFirst(){} private: int sub; }; class hwcSubSecond:hwcBase{ public: hwcSubSecond():hwcBase(){} ~hwcSubSecond(){} private: int sub; char sub2; }; int _tmain(int argc, _TCHAR* argv[]) { cout<<sizeof(emptyClass1)<<endl; cout<<sizeof(emptyClass2)<<endl; cout<<sizeof(hwcBase)<<endl; cout<<sizeof(hwcSubFirst)<<endl; cout<<sizeof(hwcSubSecond)<<endl; return 0; }
输出:1、4、8、12、16
sizeof中的表达式不会被计算
int i;i = 10;printf("%d\n", i);printf("%d\n", sizeof(i++));printf("%d\n", i);
输出结果为10,4,10
0 0
- sizeof与内存对齐
- sizeof与内存对齐
- sizeof结构体与内存对齐
- 内存中的数据对齐与sizeof函数
- 与内存对齐有关的sizeof
- sizeof 内存对齐
- 内存地址对齐 sizeof
- sizeof以及内存对齐
- 结构体拾遗补缺1:内存对齐与sizeof
- 字节对齐与sizeof
- 数据对齐与sizeof()
- 字节对齐与sizeof
- 字节对齐与sizeof
- 数据对齐与sizeof
- :c/c++ 内存对齐 sizeof
- c/c++ 内存对齐 sizeof
- sizeof union struct 内存对齐
- sizeof union struct 内存对齐
- python 碎碎记
- bzoj 1029: [JSOI2007]建筑抢修 贪心+堆
- [Qt和GLSL的笔记4] GLSL基本语法和数据类型
- Oracle用户权限及权限设置
- ns-3 教程 —— 资源
- sizeof与内存对齐
- J
- 分组背包
- 整理 : 查看和修改 mysql库、表、字段编码
- 远程服务器发布web项目
- AngularJS学习:AngularJS的甜蜜点
- Vue训练营-自定义组件
- Android之xListView网络请求上拉下拉加载
- javascript实现数字补全不足补零