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


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


  • 相关阅读:
    DNS
    NTP服务
    DHCP服务
    NFS服务、SSHD服务
    samba 、 FTP 、 lrzsz工具
    centos7系统忘记root密码
    linux系统rpm和yum软件包管理
    linux系统命令(调试命令)(nmtui,ip a、ss、ps、uptime、top、lsof、grep,iotop、iftop)
    浅聊TCP的三次握手和四次挥手
    C语言学习笔记--动态库和静态库的使用
  • 原文地址:https://www.cnblogs.com/liwugang/p/7594101.html
Copyright © 2011-2022 走看看