自然对齐和强制对齐

一 自然对齐

  各个类型自然对齐,即其起始内存地址必须是其类型本身的整数倍。

对于结构体来说,结构体的起始内存地址,必须是结构体中成员最大长度类型的整数倍。

结构体自然对齐应遵守如下规则

1 数据成员对齐规则

  在默认情况下,结构体中各成员变量存放的起始地址相对于结构体的起始地址的偏移量:

应该是sizeof(成员变量类型)或者sizeof(成员变量类型)的倍数。

  如果结构体中某个成员变量不是基本类型,比如是子结构体,它的起始地址相对于父结构体起始地址的偏移量:

应该是子结构体中最大的基本类型的整数倍。

2 整体对齐规则

  结构体占用内存的总大小也有约束条件,为最大的基本类型内存长度的整数倍。

  代码如下:

typedef struct a

{

  char c1;

  long i;

  char c2;

}A

按照自然对齐的规则1:c1与结构体起始地址偏移为0,i偏移为3(必须是i类型long的的倍数),c2偏移为8

按照自然对齐的规则2:现在偏移0-偏移8的9个字节被占用,结构体大小必须是最大成员变量类型long的倍数,所以sizeof(a)为12

typedef struct b

{

  char c1;

  char c2;

  long i;  

}B

按照自然对齐的规则1:c1与结构体起始地址偏移为0,c2偏移为1,i偏移为4(必须是i类型long的的倍数),

按照自然对齐的规则2:现在偏移0-偏移7的8个字节被占用,结构体大小必须是最大成员变量类型long的倍数,所以sizeof(a)为8

二 强制对齐

  #pragma pack(push) //保存当前对齐状态

  #pragma pack(n)  //定义对齐单元大小为n

  定义结构体

  #pragma pack(pop) //恢复保存的对齐状态

强制对齐的规则

1 数据成员对齐规则:

  n字节对齐是指结构体中成员变量的内存地址与结构体起始地址的偏移量为:

min(sizeof(基本类型), n)的整数倍

2 整体对齐规则:

  结构体的总大小也有约束条件:

min(sizeof(基本类型), n)的整数倍

可见,如果设置#pragma pack(1),就等于禁掉了数据对齐。

  

原文地址:https://www.cnblogs.com/fengxing999/p/10919590.html

时间: 2024-10-02 11:02:44

自然对齐和强制对齐的相关文章

iOS的UILabel设置居上对齐,居中对齐,居下对齐

在iOS中默认的UILabel中的文字在竖直方向上只能居中对齐,我从UILabel继承了一个新类,实现了居上对齐,居中对齐,居下对齐.具体如下: 1.新建一个类VerticalAlignmentLabel.h继承自UILabel 2. // //  VerticalAlignmentLabel.h //  inface // //  Created by huangzengsong on 15/5/10. //  Copyright (c) 2015年 huangzs. All rights r

【css基础】文本对齐,水平对齐,垂直对齐

先说水平对齐,那首先想到的就是text-align了,text-align:left,text-align:center,text- align:right,代表的就是左对齐,居中对齐和右对齐,需要注意的是如果有padding这类的东西在,千万看清楚两边的padding值是否相 同,当你看到文字不在中间的时候,可能就是因为两边的padding值不同,举例说明: <p>我是一段测试文字</p> 如果看过我前面一片做一个简单网页的日志就知道,这个应该放在body标签里面. 放在网页里就

将选定的文本对象左对齐、右对齐或对中

;; ;;程序名称:对象水平对齐程序 ;;执行命令:TXTAL ;;程序功能:将选定的对象左对齐.右对齐或对中. ;; (defun c:TXTAL(/ selobjs oldcmdecho) ;定义命令txtal,局部变量selobjs,oldcmdecho; (setq oldcmdecho (getvar "cmdecho")) ;oldcmdecho 存储命令回显模式 (setvar "cmdecho" 0) ;屏蔽提示 (setq selobjs (ssg

iOS UILabel设置居上对齐,居中对齐,居下对齐

在iOS中默认的UILabel中的文字在竖直方向上仅仅能居中对齐,博主參考国外站点.从UILabel继承了一个新类,实现了居上对齐,居中对齐,居下对齐.详细例如以下: [cpp] view plaincopy // //  myUILabel.h // // //  Created by yexiaozi_007 on 3/4/13. //  Copyright (c) 2013 yexiaozi_007. All rights reserved. // #import <UIKit/UIKit

数据对齐,有效对齐值(转载)

一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 2. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.其他平台可能没有这种情况, 但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐

iOS上如何让按钮文本左对齐问题(对齐方式)

// button.titleLabel.textAlignment = NSTextAlignmentLeft; 这句无效 button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; button.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0); 这里使用button.titleLabel.textAlignment = NSTextAlignmentL

(转)ARM体系中字、半字和字节,ARM指令字对齐半字对齐

原文传送门 字(Word):在ARM体系结构中,字的长度为32位,而在8位/16位处理器体系结构中,字的长度一般为16位. 半字(Half-Word):在ARM体系结构中,半字的长度为16位,与8位/16位处理器体系结构中字的长度一致. 字节(Byte):在ARM体系结构和8位/16位处理器体系结构中,字节的长度均为8位. ARM指令字对齐:32位地址对应的地址空间是2 32 个8位字节,若初始地址为0x00000000,按字对齐下一条地址应为0x00000004.0x00000000~0x00

C#如何设置控件水平对齐,垂直对齐

如果要设置一些控件垂直对齐,点击这个按钮 如果要设置水平对齐,则点击这个按钮,选中控件之后点击左对齐(多个按钮都试下吧,总归能对齐到你要的效果的)

Android -如何在底部左对齐,中对齐,右对齐三个按钮图片 巧用Relative Layout

Relative Layout 不仅可以指定同级的元素之间的位置关系(e.g. layout_toLeftOf) 还可以指定子元素与父元素之间的位置关系(e.g. layout_alignParentLeft 相对于父元素左对齐) 利用这一点,可以轻松实现图片在屏幕底部对齐显示. 代码如下: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://