字节对齐、sizeof和strlen
小端模式:数据的高字节放在内存的低地址,数据的低字节放在内存的高地址。记住:小端模式是相反的,只需要记住小端模式即可,windows默认采用的是小端模式。
字节对齐问题:字节对齐有3个准则:
1.结构体变量的首地址能被其最宽的基本类型成员的大小所整除;
2.结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如果需要,编译器会在成员之间加上填充字节;
3.结构体的总大小为结构体最宽基本类型成员大小的整数倍,如果有需要,编译器会在最后一个成员后面加上填充字节。
例如下面的一个程序,结构体内的数据成员类型相同,只是顺序改变,则占用的内存不同:
1 #include<iostream> 2 using namespace std; 3 4 struct A 5 { 6 char a; 7 int b; 8 short c; 9 float d; 10 double e; 11 }; 12 13 struct B 14 { 15 short b; 16 double e; 17 short c; 18 float d; 19 char a; 20 }; 21 22 23 int main() 24 { 25 cout<<"sizeof(A):"<<sizeof(A)<<endl; 26 cout<<"sizeof(B):"<<sizeof(B)<<endl; 27 28 return 0; 29 }
程序的运行结果:
sizeof(A):24
sizeof(B):32
分析:
A:char a首地址为0,则0+1=1,而根据第二条,int b的首地址必须是4的整数倍,则需要字节填充,int b的首地址是4;同理short c的首地址为8,float d的首地址为12,double e的首地址为16,总共的字节数为24,正好是最长的字节数double e的整数倍(24是8的整数倍),所以最终的sizeof(A)=24;
B:short b的首地址为0,double e的首地址为8,short c的首地址为16,float d的首地址为20,char a的首地址是24,则总共的字节数是25,不符合第三条规定(25不能被8整除),所以需要凑整变成32,则最后sizeof(B)=32.
在内存中,struct和union是要考虑内存中字节对齐问题的,但它们之间又有一些区别。struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员, 而struct的所有成员都存在。在struct中,各成员都占有自己的内存空间,它们是同时存在的。一个struct变量的总长度等于所有成员长度之和+考虑到内存对齐所补的字节。在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在。Union变量的长度等于最长的成员的长度。对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于struct的不同成员赋值是互不影响的
strlen函数:
strlen做的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间的某个位置,甚至是某个不确定的内存区域)开始扫描,直至碰到第一个字符串结束符‘\0’为止,然后返回计数器值(长度不包含'\0').
几个关于sizeof和strlen之间区别的例子:
1 #include<iostream> 2 using namespace std; 3 4 int Getsize(char data[]) 5 { 6 return sizeof(data); 7 } 8 9 int main() 10 { 11 char* ss="0123456789"; 12 13 cout<<"sizeof(ss):"<<sizeof(ss)<<endl; //结果是4,ss是指针 14 cout<<"sizeof(*ss):"<<sizeof(*ss)<<endl; //结果是1,*ss=ss[0],是首字符 15 cout<<"sizeof('0123456789'):"<<sizeof("0123456789")<<endl;//结果是11,还要加上结束符'\0' 16 cout<<"strlen(ss):"<<strlen(ss)<<endl; //结果是10,不需要加上结束符'\0' 17 18 19 char str[10]={"hello"}; 20 char* pstr=str; 21 cout<<"sizeof(str):"<<sizeof(str)<<endl; //10 22 cout<<"sizeof(pstr):"<<sizeof(pstr)<<endl; //4 23 cout<<"strlen(str):"<<strlen(str)<<endl; //5 24 cout<<"strlen(pstr):"<<strlen(pstr)<<endl; //5 25 26 cout<<"Getsize(str):"<<Getsize(str)<<endl; //4,str从实参传到形参时退化为同类型的指针 27 28 return 0; 29 }
转载于:https://www.cnblogs.com/jswu-ustc/p/8556257.html
字节对齐、sizeof和strlen相关推荐
- sizeof之字节对齐
想用结构体来存储一些数据(Objective-c环境下),结构体如下: typedef struct {char itemName;char imageNameSel;char imageNameDi ...
- C语言再学习 -- 关键字sizeof与strlen
sizeof 一.简单介绍 sizeof 是 C 语言的一种单目操作符,如 C 语言的其他操作符++.--等.它并不是函数.C 规定 sizeof 返回 sieze_t 类型的值.这是一个无符号整数 ...
- sizeof,strlen用法详解
sizeof 前向声明: sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着"辛苦我一个,幸福千万人"的伟大思想,我决定将其尽可能详细的总结一下. 但 ...
- sizeof与strlen的区别
以下内容参考自<程序员面试宝典> sizeof与strlen的区别 1. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型.该类型保证能 ...
- c语言中strlen用到的头文件,C语言中sizeof()与strlen()函数的使用入门及对比
sizeof()函数1,是什么? sizeof其实就是一个运算符,和那些+,-一样的东西,在程序编译的时候进行解析转换.虽然我们经常见到sizeof后面跟着个小括号,长得和函数差不多,但它和函数完全是 ...
- c语言sizeof strlen,C语言中sizeof与strlen区别
一.本质区别 sizeof 和strlen 有本质上的区别.sizeof 是C 语言的一种单目运算符,如++.--等,并不是函数,sizeof 的优先级为2 级,比/.% 等3 级运算符优先级高,si ...
- size_t、sizeof、strlen
size_t 1.概述: size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版.它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大 ...
- 面试题--特别是字节对齐
来源:http://www.cnblogs.com/Braveliu/archive/2013/01/04/2844757.html [1]设置或者清除某位. 示例代码如下: 1 #include&l ...
- java字节对齐 32 64_【C语言】字节对齐问题(以32位系统为例)
1. 什么是对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型 ...
最新文章
- RuntimeError: Expected object of device type cuda but got device type cpu for argument pytorch数据位置
- 河南省第二届ACM程序设计大赛解题报告(置换群)
- flex的mxmlc命令行编译as3文件成swf
- UA MATH636 信息论6 微分熵
- java死信队列_RabbitMQ 死信队列是什么鬼?
- oracle定义转储目录,Oracle 12.1新特性:在线rename或relocate数据文件
- layui时间日期控件使用
- seo伪原创工具_伪原创工具哪个好用?
- 检测是否安装了 .NET Framework 3.5
- GB2312 一二级中文汉字字库(带拼音)
- undo歌词中文音译_求sanna Nielsen 唱的undo 中文谐音歌词
- [机器学习入门笔记] 2. 2022吴恩达机器学习Deeplearning.ai课程(回顾)
- 手动更新windows补丁
- Ubantu18.04环境下编译android源码
- foo python_foo_grabber_python.dll
- 迈向人工智能的下一步-《星际争霸II》
- 推背图预测新冠病毒来袭
- iOS调用QQ客户端,发起临时会话
- ubuntu18.04终极美化
- ERP对企业市场销售环节的影响!
热门文章
- ueditor设置默认输入的字体、行间距
- tomcat7.0安装
- Android扫描二维码
- JSP 购物车相关问题
- 五种经典上涨形态、主力低位骗筹和高位出货的常用手段
- ShaderJoy —— 果冻般的弹性 “抖抖抖“ 特效【GLSL】
- 最新GNS3v2.1.0下载安装
- NOI-1.5(08) 多边形内角和
- 顺序栈的基本操作 C++
- Visual studio Code User Installer(用户安装程序)和System Installer(系统安装程式)的区别