c# object占多少字节

来源:百度知道 编辑:UC知道 时间:2024/08/22 22:23:31
Object tem = new Object();tem占多少字节?64位和32位机器的区别呢?
int i;这时候i占多大内存?
ClassA a;a占多大呢?
pztx1992:

你没有理解我说的意思,,
假如:class A{string str;public string Str(get{return str;}set{str = value;})} A a = new A();str在a中也要占空间.这样占多大?你如果new了的话,其实也是算是赋了初值的..你不知道string类型的默认值是string.empty吗?int的是0吗?不是一定要a.Str="123";才算赋初值;

Object占多少内存,谁也不知道,按照非托管的想法是,如果你只定义一个类,而它没有任何数据成员,我在VS2008下,使用默认字节对齐,
class Object
{

};
这样得出来 sizeof( Object ) 为 1。

在C#里,是不能直接获取object占用内存大小的,因为它根本不是一个标准的布局。
而楼上的BinaryFormatter的方法,只是以二进制格式将对象或整个连接对象图形序列化和反序列化。它甚至还有可能包含版本信息,所以它的结果并不能代表一个对象所占用内存的大小。
C#提供了一种可以获取一个对象的非托管内存的大小的方法。但是必须在显式指定了内存布局以及字节对齐等信息的对象上才可以使用。

现在我们定义如下对象:
[StructLayout( LayoutKind.Sequential )]
public class MyObject
{
}
,大家都知道,所有的对象都是从MyObject继承而来的,也就是说,我们上面这个MyObject类,也隐含的继承了Object。
那么,现在我们看看这段代码:
int size = Marshal.SizeOf( typeof( MyObject ) );
运行结果是1。
看来跟C++是一样的。也就是说,一个未定义任何数据成员的空对象,其占用1字节的内存。

那么我们再来看看一些标准成员的大小,比如int,long,double等。
int size = Marshal.SizeOf( typeof( int ) ); //结果为4
int size = Marshal.SizeOf( typeof( long ) ); //结果为8
int size = Marshal.SizeOf( typeof( float ) ); //结果为4
int size = Marshal.SizeOf( typeof( double ) ); //结果为8
可见,这些基本数据类型,与非托管下的大