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)

(个人意见。。。。。)




posted @ 2012-08-07 16:47  爱喝可乐  阅读(3534)  评论(0编辑  收藏  举报