zoukankan      html  css  js  c++  java
  • Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)

    在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 ,但每个元素在该结构体中偏移和上面都一样,只是在结构体的末尾添加字节用于对齐。


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


  • 相关阅读:
    XAML学习笔记之Layout(五)——ViewBox
    XAML学习笔记——Layout(三)
    XAML学习笔记——Layout(二)
    XAML学习笔记——Layout(一)
    从0开始搭建SQL Server 2012 AlwaysOn 第三篇(安装数据,配置AlwaysOn)
    从0开始搭建SQL Server 2012 AlwaysOn 第二篇(配置故障转移集群)
    从0开始搭建SQL Server 2012 AlwaysOn 第一篇(AD域与DNS)
    Sql Server 2012 事务复制遇到的问题及解决方式
    Sql Server 2008R2升级 Sql Server 2012 问题
    第一次ACM
  • 原文地址:https://www.cnblogs.com/liwugang/p/7594101.html
Copyright © 2011-2022 走看看