`
ihuashao
  • 浏览: 4710732 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

谈谈对齐(上)

阅读更多

谈谈对齐(上)

对齐问题主要有3点:变量对齐、结构对齐和数据对齐。前两点是编译器决定的变量映射和结构布局。最后一点与CPU的架构(CISC/RISC)有关。

在大多数情况下,对齐是编译器和CPU的事情,和程序员没什么关系。但在某些情况下,程序员又必须考虑对齐问题,否则会有一些麻烦。

0 约定和预备知识

0.1 地址边界

如果把字节看作小房子,内存就是顺序排列的小房子。每个小房子都有一个顺序编号的门牌号码,例如:0,1,2,...,0xffffffff。我们把这个门牌号码称作地址。本文将2的整数倍的地址记作2n边界,将4的整数倍的地址记作4n边界,依此类推。显然每个地址都是1n边界,每个4n边界都是2n边界,每个8n边界都是4n边界。

所谓“对齐”就是把变量放在什么样的地址边界上,例如:1n边界,2n边界,还是4n边界。

0.2 变量的分类

分类源自角度。有多少角度,就有多少分类。最近经常被迫收听“One World, One dream”,其实在我看来,每个生命都有独一无二的梦想,何况国家。如果狗熊有宗教信仰,它心目中的上帝应该是一只相貌儒雅的狗熊吧。

0.2.1 基本类型和复合类型

从构成看,变量可以分为基本类型的变量和复合类型的变量。基本类型就是语言内部支持的简单类型,例如char, short, int, double等。复合类型由基本类型组成,例如结构。本文将基本类型的变量记作基本变量,将复合类型的变量记作复合变量或结构变量。

基本变量的长度目前有1、2、4、8字节。以后可能会有更大的基本变量。嵌入式环境通常不支持浮点,常见的长度是1、2、4字节。

0.2.2 变量的地址

从地址看,变量可以分成有确定地址的变量和没有确定地址的变量。所谓“有确定地址”就是指在程序运行前就有确定的地址。而“没有确定地址”的变量,它们的地址是在运行时确定的。

全局变量和静态变量都有确定地址。局部变量和动态分配的变量没有确定地址。本文将有确定地址的变量记作有址变量。

1 变量对齐

1.1 没有确定地址的变量

局部变量是从堆栈分配的,编译器通常会保证每个局部变量的地址都在4n边界上。

动态分配的变量是从堆上分配。堆的实现与标准库和操作系统有关。在一些简单的嵌入式系统中,我们需要自己实现动态内存分配,这时我们要保证每次分配的内存块地址都在4n边界上,以避免后面谈到的数据对齐问题。

1.2 有确定地址的变量

有址变量的地址是在链接时确定的。编译器通常有设置变量对齐方式的编译选项,我们通常使用该选项的默认值。在默认情况下,编译器会按照默认方式对齐放置有址变量。

所谓按“按默认方式对齐”,就是将长度为1的基本变量放在1n边界上。将长度为2的基本变量放在2n边界上。将长度为4的基本变量放在4n边界上,依此类推。

每个结构变量总是由一个个基本变量构成。结构变量按照该结构中最长的基本变量对齐。如果某个结构基本变量的最大长度是1,编译器就可以把这个结构放在1n边界上。如果某个结构基本变量的最大长度是4,编译器就应该把这个结构放在4n边界上。

那么结构中的成员变量又是怎样对齐的?

分享到:
评论

相关推荐

    c语言中结构体等在计算机内存的对齐方式

    在计算机内存中,对齐机制是指将数据存储在特定的地址上,以便提高处理速度和效率。这种机制可以分为两种:对齐和不对齐。对齐机制可以节省时间,但是它也会浪费空间。那么,为什么要使用对齐机制呢?这是因为计算机...

    带噪音的社交网络对齐数据集.zip

    综上所述,"带噪音的社交网络对齐数据集"提供了一个研究社交网络对齐方法、处理数据噪音以及优化多源信息整合的宝贵资源。通过对这个数据集的深入研究和实验,我们可以增进对社交网络特性、对齐技术及其实际应用的...

    matlab一种简洁有效的非对齐不完全多视图和缺失多标签学习模型代码.zip

    接着,我们来谈谈不完全多视图(Incomplete Multi-view)的概念。在实际应用中,由于数据采集的限制或者缺失,每个视图的数据可能不完整。不完全多视图学习旨在处理这种部分视图缺失的情况,通过有效的学习算法,尽...

    谈谈Xyrate和希捷技术发展.docx

    标题中的“谈谈Xyrate和希捷技术发展”是指探讨Xyrate公司与希捷科技在存储技术领域的联合进步。Xyrate是一家专注于高性能计算(HPC)存储解决方案的公司,而希捷作为传统磁盘存储的领导者,通过收购Xyrate,增强了其...

    谈谈C51的编程规范

    【谈谈C51的编程规范】 C51是专门针对8051系列单片机的C语言编译器,由于其简洁高效的特点,在单片机编程领域得到了广泛应用。为了提高代码可读性,便于团队协作和问题解决,遵循一定的编程规范显得尤为重要。 一...

    谈谈Java中的布局管理器.pdf

    流布局管理器(FlowLayout)是一种常用的布局管理器,将组件逐行定位,行内从左到右,一行排满后换行,默认对齐方式为居中对齐,不改变组件的大小,按组件原有尺寸显示组件。 边界布局管理器(BorderLayout)将整个...

    谈谈一些有趣的CSS话题

    Flexbox擅长处理一维布局,如水平或垂直排列元素,而Grid则在二维布局上表现出色,可以方便地创建响应式、对齐和间隔均匀的网格系统。理解并熟练运用这两种布局模式,能大大提高我们的页面构建效率。 CSS中的伪类和...

    谈谈步进电机的工作原理

    通过给定子绕组通电,可以产生磁场,从而吸引转子的小齿与之对齐。根据不同的通电顺序,可以使电机按照预定的角度旋转。 例如,对于一个三相反应式步进电机来说,当A相通电时,转子的第1个齿与A相对齐;随后,当B相...

    C++对象内存分布详解(包括字节对齐和虚函数表)

    由于构造过程是从最基类开始,逐步构造派生类,因此最派生类的虚函数表地址会绑定到最后构造的对象上。这意味着,即使在基类中调用虚函数,也会执行最派生类的相应虚函数实现,除非在析构过程中,此时对象的状态已不...

    结合CSS3的布局新特征谈谈常见布局方法

    弹性盒子布局提供了一种更加高效的方式来对齐和分布容器内部的空间,即使容器的大小未知或是动态改变。通过设置display属性为flex,可以轻松创建灵活的布局。Flexbox布局特别适合复杂的布局系统,可以简化代码和维护...

    谈谈商业类PPT的制作问题.docx

    5. **细节打磨**: 注重页面中的细节处理,如对齐方式、间距调整等,提升整体美观度。 6. **风格统一**: 整体上保持一致的设计风格,确保观众能够顺畅地跟随演示进程。 #### 五、结论 商业类PPT的制作是一项复杂而...

    结合实例谈谈航拍全景的方法和技巧.docx

    在PTGui中导入照片,自动对齐并创建全景图。如果遇到天空部分缺失的问题,可以利用其他素材在Photoshop中进行补天操作,调整色彩,确保整体的视觉一致性。 3. 分享发布:完成全景图后,可以本地查看或上传至全景...

    【转】谈谈 JVM 内部锁升级过程(csdn)————程序.pdf

    padding用于内存对齐,以满足内存地址对齐的要求。 当对象被synchronized关键字加锁时,锁的实现机制与对象头中的Mark Word密切相关。在无锁状态下,Mark Word存储的是对象自身的运行时数据,比如哈希码、GC分代...

    flex css5+html5 2.zip

    6. `align-content`:当有多行Flex项时,控制它们在交叉轴上的对齐方式。 7. Flex项也有自己的属性,如`flex-grow`、`flex-shrink`和`flex-basis`,用于控制它们如何扩展、收缩和分配空间。 接下来,我们谈谈HTML5...

    游标卡尺螺旋测微器使用方法.ppt

    然后观察游标尺上哪一个刻度线与主尺的某一条刻度线对齐。例如,如果物体厚度为0.1mm,那么只有游标尺的第一条刻度线会与主尺的1mm刻度线对齐。对于0.6mm的物体,游标尺的第6条刻度线将与主尺的某个刻度线对齐。通过...

    manenschijn

    首先,我们可以谈谈字体的分类。常见的字体类型有衬线字体(如Times New Roman)、无衬线字体(如Arial)、手写体和装饰性字体。每种类型的字体都有其特点和适用场景,例如,衬线字体常用于印刷品,而无衬线字体则...

    “笔算加减法”练习课(课件).ppt

    总的来说,这堂课旨在通过多样化的练习和游戏,使学生深入理解并熟练掌握笔算加减法的基本步骤和规则,提高他们的计算能力,并通过自我反馈(如“谈谈你这节课的收获吧!”)来促进自我评估和学习反思。

    flex弹性布局+图片遮罩层作业

    2. `justify-content`: 控制子元素在主轴上的对齐方式,可选值有`flex-start`(默认,靠左/上)、`flex-end`(靠右/下)、`center`(居中)、`space-between`(两端对齐,元素间等间距)和`space-around`(每个元素...

    MyDiskTest

    然而市场上的U盘品牌繁多,品质参差不齐,如何确保购买到真实容量、高性能的U盘呢?这就需要用到专业的U盘性能检测工具——MyDiskTest。该软件为用户提供了便捷、直观的检测方法,帮助鉴别U盘真伪,避免购买到扩容盘...

Global site tag (gtag.js) - Google Analytics