zoukankan      html  css  js  c++  java
  • #pragma pack(n)

    #pragma pack(n)
    重要规则:
    1,复杂类型中各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个类型的地址相同;
    2,每个成员分别对齐,即每个成员按自己的方式对齐,并最小化长度;规则就是每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数中较小的一个对齐(对于单个char出现时,必须为2的整数倍,比如n=2时,char 占一位,但是后面有一位空;char [2],直接存储,不空位);
    3,结构、联合或者类的数据成员,第一个放在偏移为0的地方;以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度两个中比较小的那个进行;也就是说,当#pragma pack指定的值等于或者超过所有数据成员长度的时候,这个指定值的大小将不产生任何效果;
    4,复杂类型(如结构)整体的对齐是按照结构体中长度最大的数据成员和#pragma pack指定值之间较小的那个值进行;这样在成员是复杂类型时,可以最小化长度;
    5,结构整体长度的计算必须取所用过的所有对齐参数的整数倍,不够补空字节;也就是取所用过的所有对齐参数中最大的那个值的整数倍,因为对齐参数都是2的n次方;这样在处理数组时可以保证每一项都边界对齐;
    #pragma pack(n)
    struct node1{
    int a;
    char b;
    short c;
    char d;
    }test1;
    sizeof(test1)
    n=1,大小为8, a(4)+b(1)+c(2)+d(1)
    n=2,大小为10, a(4)+b(2)+c(2)+d(2)
    n=4,大小为12, a(4)+b(2)+c(2)+d(2)
     
    struct node2{
    int a;
    char b;
    struct node1 c;
    char d;
    }test2;
    sizeof(test2)
    n=1,大小14, a(4)+b(1)+c(8)+d(1)
    n=2,大小18, a(4)+b(2)+c(10)+d(2)
    n=4,大小24 a(4)+b(2)+c(12)+d(2)
     
    struct node3{
    int a;
    char b[2];
    struct node1 c;
    }test3;
    sizeof(test3)
    n=1,大小14, a(4)+b(2)+c(8)
    n=2,大小16, a(4)+b(2)+c(10)
    n=4,大小20 a(4)+b(2)+c(12)
     
    union un1{
    char a[5];
    int i;
    }u1;
    sizeof(u1)
    n=1,大小5, a(5)
    n=2,大小6, a(5)
    n=4,大小8 a(5)
     
    struct node4{
    int a;
    char b[3];
    union un1 c;
    }test4;
    sizeof(test4)
    n=1,大小12, a(4)+b(3)+c(5)
    n=2,大小14, a(4)+b(4)+c(6)
    n=4,大小16 a(4)+b(4)+c(8)
    #include<iostream>
    
    using namespace std;
    
    #pragma pack(4)
    
    struct node1{
        int a;
        char b;
        short c;
        char d;
    }test1;
    struct node2{
        int a;
        char b;
        struct node1 c;
        char d;
    }test2;
    struct node3{
        int a;
        char b[2];
        struct node1 c;
    }test3;
    union un1{
        char a[5];
        int i;
    }u1;
    struct node4{
        int a;
        char b[3];
        union un1 c;
    }test4;
    int main()
    {
        cout << "int " << sizeof(int) << endl;
        cout << "short " << sizeof(short) << endl;
        cout << "char " << sizeof(char) << endl;
        cout << "long " << sizeof(long) << endl;
        cout << "double " << sizeof(double) << endl;
        cout << "test1 "<<sizeof(test1) << endl;
        cout << "test2 " << sizeof(test2) << endl;
        cout << "test3 " << sizeof(test3) << endl;
        cout << "u1 " << sizeof(u1) << endl;
        cout << "test4 " << sizeof(test4) << endl;
        system("pause");
        return 0;
    }
  • 相关阅读:
    [LeetCode] Word Break 解题思路
    [LeetCode] Longest Valid Parentheses 解题思路
    [LeetCode] Largest Rectangle in Histogram 解题思路
    新博客
    正在学习的Angularjs包裹的插件
    Markdown
    Markdown 基础
    Angular docs
    npm-link
    webpack-hot-middleware 用于 livereload
  • 原文地址:https://www.cnblogs.com/tla001/p/5855936.html
Copyright © 2011-2022 走看看