zoukankan      html  css  js  c++  java
  • 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;
    }
    

  • 相关阅读:
    七层协议&网络配置
    解决跨域问题
    拖拽 ‘vue-grid-layout’ 插件了解下
    详解vuex
    在腾讯出差的日子
    对象的解构赋值应用
    MQTT项目请求设置
    五分钟搞定Go.js
    Chrome使用video无法正常播放MP4视频的解决方案
    微信小程序地图开发总结
  • 原文地址:https://www.cnblogs.com/zi-xing/p/6354472.html
Copyright © 2011-2022 走看看