sizeof之字节对齐
想用结构体来存储一些数据(Objective-c环境下),结构体如下:
typedef struct {char itemName;char imageNameSel;char imageNameDis;BOOL isSelOrDis; } StructTest1;
那如果itemName是NSString类型的,结构体如下:
1 typedef struct { 2 __unsafe_unretained NSString * itemName; 3 __unsafe_unretained NSString * imageNameSel; 4 __unsafe_unretained NSString * imageNameDis; 5 BOOL isSelOrDis; 6 } StructTest2;
之后,我想把几个结构体对象放入一个NSArray里的时候,想知道他们分别占用的内存空间多大。
经过验证,sizeof(StructTest1)等于4,sizeof(StructTest2)等于32,单独理解起来都不是很难,char 类型占1位,BOOL占一位,NSString占8位。可sizeof(StructTest2)等于32,Why?没错,BOOL也占了8位,可在StructTest1结构体中只占了1位,这里就涉及到了一个概念,字节对齐。
百科里是这样解释的:
为什么需要字节对齐计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上,以此类推。这样,两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。
暂时理解了这么多,以后有新的认识了再补充。
以上。
转载于:https://www.cnblogs.com/zpz501/p/5279222.html
sizeof之字节对齐相关推荐
- 字节对齐、sizeof和strlen
小端模式:数据的高字节放在内存的低地址,数据的低字节放在内存的高地址.记住:小端模式是相反的,只需要记住小端模式即可,windows默认采用的是小端模式. 字节对齐问题:字节对齐有3个准则: 1.结构 ...
- 面试题--特别是字节对齐
来源:http://www.cnblogs.com/Braveliu/archive/2013/01/04/2844757.html [1]设置或者清除某位. 示例代码如下: 1 #include&l ...
- java字节对齐 32 64_【C语言】字节对齐问题(以32位系统为例)
1. 什么是对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型 ...
- (转)C语言字节对齐
图片可以在下面的博客中看到. 转自:http://blog.csdn.net/bigloomy/article/details/6633008 可能有不少读者会问,字节对齐有必要拿出来单独写一篇博客嘛 ...
- 怎么把位域合成一个字节_C语言中字节对齐和位域
1.1基本类型默认字节对齐和改变字节对齐方式 c语言在给不同类型变量分配地址空间时,并不是总是紧邻着上一个变量的地址空间分配的,而是它所在的地址空间,必须被它的默认对齐字节数整除.例如,int类型占4 ...
- 面试常考,项目易错,长文详解C/C++中的字节对齐
作者 | 李肖遥 来源 | 技术让梦想更伟大(ID:TechDreamer) 头图 | CSDN 下载自东方IC 引入主题,看代码 我们先来看看以下程序 //编译器:https://tool.lu/ ...
- C/C++结构体字节对齐详解
结构体的sizeof 先看一个结构体: struct S1 { char c; int i; }; sizeof(S1)在VC6中按默认设置得到的结果为8. 我们先看看sizeof的定 ...
- mysql字节对齐_结构体字节对齐-位域及其对齐
字节对齐的准则:其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2) 结构体每个成员相对于结构体首地址的偏移量都是成 ...
- 结构体为什么要4字节对齐
sizeof与struct--求结构体大小的计算方法 sizeof浅析(一)--求结构体大小 这篇文章讲了sizeof求结构体大小的计算方法,并给出可以套用的准则: 一.存储变量时地址要求对齐,编译器 ...
最新文章
- CNN 中1X1卷积核的作用
- mysql命令:为mysql命令指定字符集
- 都说雪花ID不能做MySQL的主键,你确定?
- 你不知道的JavaScript(二)
- 工具 每分钟_black: 一个不妥协的Python代码格式化工具
- mysql中逗号前的字符串_MySql逗号拼接字符串查询的两种方法
- Java 9 将采用新的版本字符串格式
- Redis 高负载下的中断优化
- 完全弄懂C++中的构造与析构函数
- 一文说清Elasticsearch的核心概念
- 返回JSON出现Infinite recursion无限循环错误的解决
- pip 通过pqi切换源到国内镜像
- 使用Kotlin的Android SeekBar
- 计算机组成原理菊花链是什么,计算机组成原理试题解析8
- 算法竞赛进阶指南 激光炸弹
- uni-APP 联系我们
- 在win10系统安装linux系统,win10系统安装Linux子系统的操作方法
- 未来科技的五大发展趋势
- 基于JAVASE的彩票摇号系统
- Java day02:eclipse的部分快捷操作;单元测试;条件控制语句;补充的基础语法和代码小技巧
热门文章
- 将给出的整数x翻转_每日一题:1.罗马数字转整数
- java 按钮文字_java Button中的标签怎样显示汉字?
- toad mysql导入excel_Oracle 使用TOAD实现导入导出Excel数据
- 001_Layout布局
- android教程登陆,【教程】Android 记住密码和自动登录界面的实现
- mysql dump 查看器_mysql备份之mysqldump工具
- python转go_如何看待将Python代码转换成Go代码并进一步编译的 Grumpy 项目?
- grep 与条件_小白贴:使用 grep 命令搜索多个字符串
- LeetCode刷题之旅
- android修改系统设置权限_安卓保护隐私利器!完美解决软件「不给权限就不运行」的小工具...