在windows下设置字节对齐大小的方式,目前我了解有三种:

1. 在编译程序时候的编译选项  /Zp[n],如 cl /Zp4 表示对齐大小是4字节;

2. 预处理命令   #pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  );

3. 微软特定命令  __declspec(align(#))。



下面我将分别介绍这三种,并分析不同方式的优缺点,先明确下字节对齐大小都是2的指数倍如1,2,4,8,16,32等。

方法一的用法最为简单,只需要在编译选项设置就行,该方式将作用于整个模块,因此是全局性的,不够灵活。

方法二的用法复杂点,但该方法可以在一个模块中不断的设置字节对齐大小,灵活性很强,针对不同的结构体采用不同的对齐大小,很适合这种方法,但用法较为复杂。

方法三的方法主要是作用于整个结构体上,是加强了字节对齐的限制,如将整个结构体对齐为64字节,不管里面元素总的大小,则结构体大小为大于总大小的最小的64倍数。

结构体大小的确定以及每个元素位置的确定:

对齐大小为 align(方法一和方法二设置的值,在vs2013中默认为8字节)、结构体中元素字节最大为max、结构体对齐align_struct(由方法三进行设置)

假设内存是一个一个篮子用于存放结构体的每个变量, 而篮子肯定有大小   = min(align, max)大小为对齐大小和元素字节最大的 较小者。

下面就是将元素放入篮子的问题,有个原则是:

"The alignment of a member will be on a boundary that is either a multiple ofn or a multiple of the size of the member, whichever is smaller."

每个元素放置的位置 要么是 对齐大小的整数倍,要么是 该元素大小的整数倍,比较这两个值,哪个小就放在那。

若没有方法三设置,则最后结构体的大小就为篮子 大小的倍数,若有方法三的设置最后在考虑结构体整体的字节对齐。下面举个例子:

typedef struct A
{
char ca;
int ib;
short sc;
int id;
double de;
}A;

若对齐大小align=4, 则 max = 8 = sizeof(double), 篮子大小为 min(4,8) = 4.

char ca 放在第一个篮子中, 偏移为0

int ib 要放在的位置必须为4的倍数,所以放在第二个篮子中,偏移为4

short sc 要放在的位置为2的倍数, 所以放在第三个篮子中,偏移为8

       int id要放在位置为4的倍数, 第三个篮子没有这样的位置,所以放在第四个篮子中,偏移为12

      double要放在位置为4的倍数,放在第五个篮子和第六个篮子中,偏移为16,

可以看出总共用了6个篮子,总大小sizeof(A) = 24.

若添加方法三在结构体上 如下

typedef struct __declspec( align( 32) ) A
{
char ca;
int ib;
short sc;
int id;
double de;
}A;

修饰结构体的对齐大小为32,则sizeof(A) = 32 ,但每个元素在该结构体中偏移和上面都一样,只是在结构体的末尾添加字节用于对齐。

现在只是简单介绍了三种方法和结构体大小的确定 ,将在后面具体介绍方法二和方法三的用法。

Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)的更多相关文章

  1. 【转】C/C++ struct/class/union内存对齐

    原文链接:http://www.cnblogs.com/Miranda-lym/p/5197805.html struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(s ...

  2. C++字节对齐与结构体大小计算

    转载注明出处:http://pppboy.blog.163.com/blog/static/30203796201082494026399/ 感谢原创博主的辛勤成果. 说明: 结构体的sizeof值, ...

  3. struct结构体大小的计算(内存对齐)

    本次实验环境 环境1:Win10, QT 5.12 一. 背景 当普通的类型无法满足我们的需求的时候,就需要用到结构体了.结构体可衍生出结构体数组,结构体还可以嵌套结构体,这下子数据类型就丰富多彩了, ...

  4. C语言的struct/union字节对齐

    C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念:1.数据类型自身的对齐值:对于char型数据,其自身对 ...

  5. struct与union字节大小的终极解释

    1.字节对齐的细节和编译器实现相关,但一般而言,如在windows下,就VC而言,满足一下三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除:2) 结构体每个成员相对于结构体首地址 ...

  6. windows下多字节和宽字节转换

    先简单说下什么是多字节和宽字节. 多字节是指使用多个字节(1-3)表示一个字符.比如gbk使用英文占一个字节,中文占2个,这个就是多字节了.utf-8是使用1-3个字节表示字符.还有big5等等. 宽 ...

  7. windows下vim编辑器,字符编码设置。

    在windows下的vim默认字符集修改 之前使用vim编辑器的时候碰到乱码的问题,后来在网上看了记下了:在vim编辑器中按esc进入命令模式 1.修改vim内部编码    set encoding= ...

  8. Windows下的cmd命令行中设置环境编码

    我们都知道,Windows下的cmd命令行默认编码是Windows系统的编码,就是ANSI编码或者说是GBK编码的,这样我们编写的很多应用比如php编写utf-8编码的应用在命令行下面运行时都会出现乱 ...

  9. Windows下Apache应用环境塔建安全设置(目录权限设置)

    目的:为Apache,php配置受限制的用户权限.保护系统安全.需要的朋友可以参考下. 环境配置情况: apache安装目录:d:\www-s\apache php目录:d:\www-s\php5 m ...

随机推荐

  1. mysql utf8mb4 设置

    [mysqld]collation-server=utf8mb4_general_ciinit-connect='SET NAMES utf8mb4'character-set-server=utf8 ...

  2. CSP中的选择

    P ∩ Q (P or Q) 由机器做出选择,环境无法控制,设计软件时只实现一个即可 P[]Q一般选择(Genral choice) 环境可以控制选择P或Q,若P不可接受这个动作,则执行Q,若Q不可接 ...

  3. js的缓存

    无网络的情况下,使用静态资源呈现页面的方法,只有h5的manifest 有网的情况下(可以连接到服务器的情况下),有3种判断缓存的方式. ------------------------------- ...

  4. C++类的大小计算

    转自http://www.tuicool.com/articles/uiUJry 一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分? 一个Class对 ...

  5. 雷林鹏分享:jQuery EasyUI 数据网格 - 扩展行显示细节

    数据网格(datagrid)可以改变它的视图(view)来显示不同的效果.使用详细视图,数据网格(datagrid)可以在数据行的左边显示展开按钮("+" 或者 "-&q ...

  6. 数字类型转换 --Python3

    数值运算符可以隐式转换输出结果的数字类型,另外,Python内置的数字类型转换函数可以显示地在数字类型之间转换: 函数 描述 int(x) 将x转换为整数,x可以是浮点数和字符串类型 float(x) ...

  7. 七天学会ASP.NET MVC ——深入理解ASP.NET MVC

    七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC   系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二) ...

  8. selenium自动加载各个浏览器插件

    在自动化测试过程中,通过selenium启动浏览器时,可能需要加载插件(如测试用的firebug.或产品中要求必须添加某插件等).读取用户数据(自己浏览器的配置文件/别人直接给的浏览器配置文件).设置 ...

  9. 根据框架的dtd或xsd生成xml文件

    下载Schema文件 首先要下载框架官网下的xsd或者xml文件,例如Spring官网地址,schema里面的就是xsd文件 Myeclipse中配置 我用的Myeclipse纯净版6.5,Windo ...

  10. Javascript原型,原型链?有什么特点?

    如何: js中继承都是通过原型对象实现的 什么是原型对象: 集中存储同一类型的所有子对象,共用成员的父对象 何时: 只要继承,必然原型对象 如何: 创建: 不用创建,买一赠一 每创建一个构造函数,都附 ...