Struct与Class辨析

简介:

2010 .NET面试题整理之基础篇》文中第十三题为:

==========================================

13、在dotnet中类(class)与结构(struct)的异同?

Class可以被实例化,属于引用类型,是分配在内存的堆上的 
Struct属于值类型,是分配在内存的栈上的。

==========================================

什么时候dotnet中类与结构的异同变成一个是分配在堆上一个分配在栈上了?搜索引擎一搜,网上全是这种说法,吓一跳。顺藤摸瓜,原来是出自《[你必须知道的.NET] 第四回:后来居上:class和struct》。

我个人不认同这种观点,我认为它们的本质区别不是分配在栈和堆的问题,甚至跟分配在栈和堆关系不大,而是下面两点:

· struct的实例 所占内存大小是固定的,class实例 所占内存大小是不固定的(因为可以继承);当然,从另一个角度解读就是class是可继承的,而struct是不可以继承的;这是一个硬币的两面;这是它们在存储上的区别,你可以把struct当作阉割后的class。

· struct  默认 是传值,但可以传引用,class则默认传引用,无法传值这是它们在使用上的区别

下面展开说几点:

(1)class也可能分配在栈上(特例)

Int32[] cache = new Int32[100];

cache一个数组,是class,使用 new 关键字,它是分配在堆上的。

Int32* cache = stackalloc Int32[100];

当使用 stackalloc 它就是分配在栈上了。

值类型数组是特例,但这一特例就够了,表明class是可以分配在栈上的。一般的class是无法分配在栈上的,编辑器解释说无法知道size。当然,你也可以认为数组是一个特殊的类型,这个特例不算。实际上,这里的数组已经丢失了class的特征了,你再也无法用数组类去引用它了。如果去除这个特例,则class无法在栈上分配。但是,你也可以这样理解——不是不能,而是不为,微软目前还不想这样干。因为虽然class的size是不确定的,但一个class的实例存在一个最小size,只分配这个最小size的内存即可——C++就这样干的。微软不支持,可能他们认为这样没必要,不必要搞这么复杂。一般来说,能够stackalloc 值类型数组就足够了。

(2)struct也可以分配在堆上

这个无须解释。任何class里面的struct都是分配在堆上的(通过stackalloc分配的数组除外)。有没办法直接分配呢?我试了几分钟,没发现把struct直接分配在托管堆上的方法,但却可以通过Marshal.AllocHGlobal方法分配在非托管堆上。因此,有两种方法可以struct分配在堆上:

(a)设struct是某个class的成员,可将struct分配在托管堆上

(b)使用Marshal或自己写的内存分配器,可将struct分配在非托管堆上

(3)struct也可以传引用

struct默认是传值的,在安全环境下,使用ref关键字可以传引用,在非安全环境下,使用指针可以传引用。

(4)引入struct是为了解决性能问题——小粒度对象的传值比传引用效率高。同时,在非安全代码中,可以使用struct以及指针和非托管资源交互。

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2010/03/31/1701056.html如需转载请自行联系原作者


xiaotie 集异璧实验室(GEBLAB)

相关文章
C4.
|
1月前
|
C++ 开发者
C++ struct与class
C++ struct与class
C4.
22 0
|
1月前
|
C++ 开发者
类和对象一封装一c++中class和struct的区别
类和对象一封装一c++中class和struct的区别
14 0
|
1月前
|
编译器 C++
c++中typename和class的区别
c++中typename和class的区别
27 0
|
3月前
来自C++primer5 的struct和class定义类的区别
来自C++primer5 的struct和class定义类的区别
14 0
|
4月前
|
存储 数据处理 Swift
在Swift中,类(class)和结构体(struct)
在Swift中,类(class)和结构体(struct)
30 1
|
6月前
|
前端开发 JavaScript UED
display none 和 opacity 0 二者的区别辨析
display none 和 opacity 0 二者的区别辨析
65 0
|
7月前
类和对象-封装-struct和class的区别
类和对象-封装-struct和class的区别
26 0
|
8月前
|
编译器 C语言 C++
C++中的 class和struct区别
C++ 中保留了C语言的 struct 关键字,并且加以扩充。在C语言中,struct 只能包含成员变量,不能包含成员函数。而在C++中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数。 C++中的 struct 和 class 基本是通用的,唯有几个细节不同: 使用 class 时,类中的成员默认都是 private 属性的;而使用 struct 时,结构体中的成员默认都是 public 属性的。 class 继承默认是 private 继承,而 struct 继承默认是 public 继承(《C++继承与派生》一章会讲解继承)。 class 可以使用模板,
86 0
|
11月前
17-类和对象-封装-class和struct的区别
17-类和对象-封装-class和struct的区别
|
C++
<C++> 类和对象之封装,精准区分class与struct
<C++> 类和对象之封装,精准区分class与struct
72 0

热门文章

最新文章