• What's the #pragma pack


    What's the #pragma pack

    这是一个预编译宏, 目前我对于它的认识是: 告诉编译器对于某些结构进行字节对齐使用的. 目前阶段,几乎不使用, 只是见到了, 有疑问, 先简单学习记录一下初步的了解. 大家可以根据自己的环境, 进行实验测试.

    我的理解

    struct test
    {
        char c;
        short s1;
        short s2;
        int i;
    };
    

    就像这个新结构, 如果使用sizeof计算类型的空间大小, 应该返回的是多少呢?
    天真的理解是: 9 = 1(char) + 2(short) + 2(short) +4(int);

    这是错误的. 我记得学习计算机组成原理的时候, 老师在课堂上提到过计算机内存的字节对齐问题, 因为当时是理论课程, 枯燥乏味. 当时只是有疑惑,可是没有深入研究. 今天应该有个所以然了.

    实验中的结果是 12 = 1(char) + 3(补齐) + 2(short) + 2(short) + 4(int);

    可以这么理解, 一行存放4个字节, 存放三行.

    1 * * * // char 
    1 1 1 1 // short short
    1 1 1 1 // int
    

    或者

    1 * 1 1 // char  short
    1 1 * * // short
    1 1 1 1 // int
    

    到底使用哪种方式补齐的, 这个和原理有关了. 感兴趣的童鞋, 可以继续深入.

    编译器的默认对齐字节, 有的说是当前结构的类型中字节最大的那个, 也有的说编译器有默认的. 这个需要测试.

    如果想确切对齐字节的大小, 就要使用到这个宏了.

    天真通过努力, 也是可以实现自己所想的.

    #include <iostream>
    using namespace std;
    
    #pragma pack(1)//手动将对齐方式修改为1,。所以结果9=1+2+2+4
    
    struct test
    {
        char c;
        short s1;
        short s2;
        int i;
    };
    
    int main()
    {
        cout<<"sizeof(test) == "<<sizeof(test)<<endl;
        return 0;
    }
    

  • 相关阅读:
    Tomcat线程参数
    CDH平台规划注意事项
    python 不同数据类型的序列化
    Python 中__new__方法详解及使用
    线程生命周期
    如何在JAVA中每隔一段时间执行一段程序
    手动开启是事务提交回滚
    MySQL数据类型转换函数CAST与CONVERT的用法
    mybatis插入是返回主键id
    解决dubbo注册zookepper服务IP乱入问题的三种方式
  • 原文地址:https://www.cnblogs.com/zi-xing/p/6354472.html
Copyright © 2020-2023  润新知