zoukankan      html  css  js  c++  java
  • 21年5月24说说结构体

    C/C++的结构体, 不是定义, 是设计一个类型.

    这个类型是不占空间的, 只有用它定义了变量之后, 才开辟空间(占空间).

    关于结构体对齐计算大小 >> 1 根据下一个成员及其类型确定当前的大小

                 2 根据最大的类型, 确定最终的大小

    结构体有联合体的时候

    struct student
    {
      char a;
      union ad
      {
        int aa;
        int bb;
      };
    };
    struct student
    {
      char a;
      typedef union add
      {
        int aa;
        int bb;
      }as;
    };

    主函数代码统一如下

    int main()
    {
      struct student s1;
      int size = sizeof(s1);
      printf("%d",size);
    
    return 0;
    }

    第一个的, 这个时候s1的大小是1,  因为union只是设计了一个类型, 并没有定义变量  ( 在main里面 student::ad y; 就可以定义一个联合体变量了 )

    第二个的( 注意typedef ), 这个时候s1的大小也是1, 不管 add 和 as 有没有, 都是1. 因为这里的 as 并没有定义变量, 只是 typedef 起的别名.



    struct student
    {
      char a;
      union 
      {
        int aa;
        int bb;
      };
    };
    struct student
    {
      char a;
      union add
      {
        int aa;
        int bb;
      }as;
    };

    第一个的,  s1的大小是8,  对齐之后的结果.   因为这个是无名的联合体,  被当作一个成员在看待.  struct里面的成员.

    第二个的,  s1的大小也是8,  注意这里的 add 是联合体的名字,   as 是这个联合体定义的一个变量.  (类型不开辟空间, 变量开辟空间 )

        第二个里面 没有 typedef,  这是区别于之前的关键所在

     

    总结:

      这里是在struct 里面以 union 为例子,  但是道理都是相通的.   struct 里面再嵌套一个struct  (而不是union),   同样满足这些规则.

      类型是不占空间,   变量才占.



    Linux学习笔记
  • 相关阅读:
    C++模板实战6:迭代器
    Hacking up an armv7s library
    Android之ListView分页数据加载
    Android 命令行打包和签名
    django 自定模板标签的注册
    [置顶] 高效能人士的七个习惯读书笔记(二)
    价格战拉上了Android平板电脑
    Synergy 多系统共享鼠标键盘 Windows 和 Mac 完全配置教程
    global planner源码阅读
    源码安装eigen
  • 原文地址:https://www.cnblogs.com/zealwang/p/14803455.html
Copyright © 2011-2022 走看看