zoukankan      html  css  js  c++  java
  • c struct 以及与之相关的一些其他小问题

    struct 是一个简单的类型,因为它是一个值类型,struct又是一个复杂的类型,因为它里面又可以嵌套很多的其它类型,里面的其他类型又可以包括比如struct之类的类型,所以说struct这个东西还是一个很有趣的东西。

    (首先声明:环境vs2010 cpp文件,推论以这个编译器为基础)
    1 值类型和引用类型
    这个一个老生常谈,面试必问,好像不问你就显不出面试官的水平,也显不出面试者的水平,反正5年了吧,我所面试的每次都会被问到这个问题,然后我就说struct是值类型,class是引用类型。

    (停!stop!说的是毛啊,这谁都知道,谁都知道的你唧唧歪歪什么,我上高中,哦不,上大学大一的时候课本上就写了,struct是值类型,class是引用类型,说点有用的!)
    好,说点有用的,(以下是引用clr via C# 那本书的内容)
    值类型和引用类型都需要在堆栈上分配,对值类型的操作是一个复制过程,复制完是两个东西,引用类型是相当于指针,所有的都指向一个东西,不管你引用几次,他们最终都是一个东西,顺便说一句,装箱和拆箱,装箱是先分配一个内存,然后把值类型放进去,这时候的值类型的生命周期已经变了, 随着装箱的生命周期而变动,拆箱是进行一个复制的过程,复制值,然后销毁内存,虽然都耗费性能,但是,拆箱要比装箱低得多!over
    说值类型和引用类型也很无趣,我觉得一个程序员,拉风的程序员,谁会刻意的去玩命的装箱拆箱,扯淡呢!(个人意见)

    2  struct 的内部的一些问题
       简单的一个stuct

     struct a
    {
    
    };
    
     void main()
     {
        printf("%d",sizeof a);
        int d=0;
        scanf("%d",d);
     }

    结果显示1,为何他是1,不应该是空嘛?
    (之所以强调是vs2010,因为在c文件中编译不通过,在linux下c文件和cpp文件中显示的也不一样,所以一开始就强调环境)
    因为一个空结构,即使没有内部成员,但是必须在内存上有所体现,不然在取地址的时候就出问题了

    继续,

     struct a
    {
        char x;
        char y;
        a(char a1,char a2)
        {
            x=a1;
            y=a2;
        }
    a();
      ~a; };
    void main() { printf("%d",sizeof a);
    a fish('1','2');
    int d=0; scanf("%d",d); }


    a()是默认构造函数,即使你不写,他也是隐藏存在的,除了我自己写的,还有一个a(const a&) 这个是拷贝构造函数
    http://www.cnblogs.com/ltang/archive/2010/10/08/1861145.html
    参考这个,我不是很了解,因为确实没怎么用过,悲催

    3 再换个话题,struct的对齐方式

     struct  sa
     {
     char a;
     long b;
     };
    
     struct sb
     {
     char a;
     int b;
     sa struct1;
    };
    
    void main()
    {
        char *a="112312";
        printf("%d\n",sizeof(sa));
        printf("%d",sizeof(sb));
        int d=0;
        scanf("%d",d);
    }

    结果 8  16,

    long类型是4字节,char是1字节,一个stuct以最大的长度作为对齐方式,也就是摆放的其实是这样
    1---
    ----
    char占了1个,后面补充了没用的三个,long占四个,所以整个就是8个

    假如是这样,

     struct  sa
     {
     char a;
     char c;
     long b;
     };

    sizeof sa还是8个,因为2个char连续,char a后面有三个字节,char c用一个就够了,还空出来两个,假如是这样

     struct  sa
     {
     char a;
     int c;
     int d;
     long double b;
     };

    long double 占8个,char 占1个  int占4个,(剩余3个字节)int 占4个,空间不够了,int d 会另起一行,而不是d在c后面填充一个,第二行填充三个,

    14---

    4----

    8

     struct  sa
     {
     char a;
     int c;
     int d;
     int e;
     long double b;
     };

    是这样么个摆放方式!以上两段代码的sizeof是一样的

    sb里,也一样char占四个,int占四个,sa占8个,加起来是16个

    然后,又来了一个问题,sa里的八个是整体算八个,还是拆开为char 和long 各自占4个总共8个呢!
    做个测试:

    #include<stdio.h>
    #include<stdlib.h>
    
     struct  sa
     {
     char a;
     long b;
     };
    
     struct sb
     {
    char a;
    char b;
    char c;
    int d;
    char e;
     sa struct1;
    };
    
    void main()
    {
        char *a="112312";
        printf("%d\n",sizeof(sa));
        printf("%d",sizeof(sb));
        int d=0;
        scanf("%d",d);
    }

    struct中假设sa整体占八个,那么3个char+一个int+1个char总共是8个,sa占8个,那就应该是16!
    测试结果是20,也就是3个char 占4个,一个int 占4个,一个char占4个,sa占8个!也就是说 sa并不是整体算八个,而是相当于这样的摆放方式

     struct sb
     {
    char a;
    char b;
    char c;
    int d;
    char e;
    // sa struct1;//等同于
     char a;
     long b;
    };

    然后问题又来了!
    按照这个摆放方式,应该是
    111-(char a char b char c)

    4      (int d)
    11-- (chare char a)
    4     (long b)
    才对的啊,结果应该还是16才对!
    因为sa 是一个整体,虽然可以写成那种模式,但是他里面的元素要另起一行,不和其他的外部元素共用!
    111-(char a char b char c)
    4      (int d)
    1--- (char e )
    1--- ( char a)
    4     (long b)

    (个人意见。。。。。)




  • 相关阅读:
    Day4-装饰器
    Day3-递归函数、高阶函数、匿名函数
    Day3-函数及作用域
    Day2-字符编码转换
    Day2-文件操作
    Day2-列表、字符串、字典、集合
    Day1-模块初识
    JavaScript 笔试题
    从JavaScript 数组去重谈性能优化
    prototype
  • 原文地址:https://www.cnblogs.com/fish124423/p/2626971.html
Copyright © 2011-2022 走看看