• 内存对齐代码解析


    // 内存对齐.cpp : Defines the entry point for the console application.
    //

    #include "stdafx.h"
    #include <iostream>
    using namespace std;

    #pragma pack(8) //指定对齐值
    struct example1
    {
    long b;
    short c;
    long d;
    };
    struct example2
    {
    char a;
    example1 struct1;
    short e;
    };
    #pragma pack() //取消指定对齐,恢复缺省对齐

    int _tmain(int argc, _TCHAR* argv[])
    {
    example1 temp1;
    example2 struct2;
    memset(&temp1,0,sizeof(example1));
    memset(&struct2,0,sizeof(example2));

    cout << sizeof(temp1) << endl;
    cout << sizeof(example2) << endl;
    cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) << endl;

    return 0;
    }

    //1)数据类型自身的对齐值:就是上面交代的基本数据类型的自身对齐值。
    //2)指定对齐值:#pragma pack (value)时的指定对齐值value。
    //3)结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
    //4)数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值。

    //#pragma pack(2)
    //10 //struct1.sizeof
    //14 //struct2.sizeof
    //+ &struct2 0x0042f8d0 {a=0 '' struct1={b=0 c=0 d=0 } e=0 } example2 *
    //+ &struct2.a 0x0042f8d0 "" char *
    //+ &struct2.struct1.b 0x0042f8d2 {0} long *
    //+ &struct2.struct1.c 0x0042f8d6 {0} short *
    //+ &struct2.struct1.d 0x0042f8d8 {0} long *
    //+ &struct2.e 0x0042f8dc {0} short *
    //+ &temp1 0x0042f8e8 {b=0 c=0 d=0 } example1 *
    //+ &temp1.b 0x0042f8e8 {0} long *
    //+ &temp1.c 0x0042f8ec {0} short *
    //+ &temp1.d 0x0042f8ee {0} long *

    //#pragma pack(5)
    //warning C4086: expected pragma parameter to be '1', '2', '4', '8', or '16'
    //12 //struct1.sizeof
    //20 //struct2.sizeof
    //+ &struct2 0x0022fa98 {a=0 '' struct1={b=0 c=0 d=0 } e=0 } example2 *
    //+ &struct2.a 0x0022fa98 "" char *
    //+ &struct2.struct1.b 0x0022fa9c {0} long *
    //+ &struct2.struct1.c 0x0022faa0 {0} short *
    //+ &struct2.struct1.d 0x0022faa4 {0} long *
    //+ &struct2.e 0x0022faa8 {0} short *
    //+ &temp1 0x0022fab4 {b=0 c=0 d=0 } example1 *
    //+ &temp1.b 0x0022fab4 {0} long *
    //+ &temp1.c 0x0022fab8 {0} short *
    //+ &temp1.d 0x0022fabc {0} long *


    //#pragma pack(6)
    //12 //struct1.sizeof
    //20 //struct2.sizeof
    //+ &struct2 0x0046fcd4 {a=0 '' struct1={b=0 c=0 d=0 } e=0 } example2 *
    //+ &struct2.a 0x0046fcd4 "" char *
    //+ &struct2.struct1.b 0x0046fcd8 {0} long *
    //+ &struct2.struct1.c 0x0046fcdc {0} short *
    //+ &struct2.struct1.d 0x0046fce0 {0} long *
    //+ &struct2.e 0x0046fce4 {0} short *
    //+ &temp1 0x0046fcf0 {b=0 c=0 d=0 } example1 *
    //+ &temp1.b 0x0046fcf0 {0} long *
    //+ &temp1.c 0x0046fcf4 {0} short *
    //+ &temp1.d 0x0046fcf8 {0} long *

    //#pragma pack(8)
    //12 //struct1.sizeof
    //20 //struct2.sizeof
    //+ &struct2 0x0020faec {a=0 '' struct1={b=0 c=0 d=0 } e=0 } example2 *
    //+ &struct2.a 0x0020faec "" char *
    //+ &struct2.struct1.b 0x0020faf0 {0} long *
    //+ &struct2.struct1.c 0x0020faf4 {0} short *
    //+ &struct2.struct1.d 0x0020faf8 {0} long *
    //+ &struct2.e 0x0020fafc {0} short *
    //+ &temp1 0x0020fb08 {b=0 c=0 d=0 } example1 *
    //+ &temp1.b 0x0020fb08 {0} long *
    //+ &temp1.c 0x0020fb0c {0} short *
    //+ &temp1.d 0x0020fb10 {0} long *

  • 相关阅读:
    mobile app 的总结
    ie和火狐javascript区别
    zepto源码注释
    ie6bug
    html5游戏网站
    jquery作者封装函数
    vue element 动态表格
    uniapp 对 系统的控制,全屏,系统虚拟键盘,手机导航,强制横屏
    环形图表记录
    清除所有的滚动条
  • 原文地址:https://www.cnblogs.com/hanleng/p/5337350.html
Copyright © 2020-2023  润新知