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)
(个人意见。。。。。)