zoukankan      html  css  js  c++  java
  • 内存对齐代码解析

    // 内存对齐.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 *

  • 相关阅读:
    Get distinct count of rows in the DataSet
    单引号双引号的html转义符
    PETS Public English Test System
    Code 39 basics (39条形码原理)
    Index was outside the bounds of the array ,LocalReport.Render
    Thread was being aborted Errors
    Reportviewer Error: ASP.NET session has expired
    ReportDataSource 值不在预期的范围内
    .NET/FCL 2.0在Serialization方面的增强
    Perl像C一样强大,像awk、sed等脚本描述语言一样方便。
  • 原文地址:https://www.cnblogs.com/hanleng/p/5337350.html
Copyright © 2011-2022 走看看