~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
struct MyStruct
{
int x;
int y;
int z;
};
int _tmain(int argc, _TCHAR* argv[])
{
int a = 100; int b[100];
for( int i=0;i<100;i++ )
b[i]=1000; MyStruct p;
p.x=100;
p.y=100;
p.z=100; MyStruct *pp = new MyStruct;
pp->x=200;
pp->y=200;
pp->z=200; printf("size of int (sizeof a) is: %d.\n",sizeof a);
//4 printf("size of int[100] (sizeof b) is: %d.\n", sizeof b);
//400 printf("size of MyStruct (sizeof p) is: %d.\n", sizeof p);
//12 printf("size of Pointer of MyStruct (sizeof pp) is: %d.\n", sizeof pp);
//4 printf("size of Pointer to MyStruct (sizeof *pp) is: %d.\n", sizeof *pp);
//12 getchar();
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
正如这段c++的代码所显示的那样,c++中,sizeof可以根据变量名称返回其所占用的内存空间的大小,而且,配合*操作符,也能得到指针变量所指向的内存区域的大小。
但同样想要得到引用型变量所指向的内存区域的大小,在c#中,似乎就没有办法利用sizeof做到,从MSDN的资料来看,c#中的 sizeof 运算符只适用于值类型,因此下面这样的c#代码在运行时就是有问题的。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public struct MyStruct
{
public int x; public int y; public int z;
}
public static void Main()
{
int a = 100; int[] b = new int[100];
for(int i=0;i<100;i++)
b[i]=200; MyStruct p;
p.x=100; p.y=100; p.z=100; unsafe
{
Console.WriteLine(sizeof(int));
//4 Console.WriteLine(sizeof(b));
//找不到类型或命名空间名称“b”(是否缺少 using 指令或程序集引用?) Console.WriteLine(sizeof(MyStruct));
//12
}
RL();
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
那么,想请问,在c#中如何才能获得引用型变量所占用的内存区域的大小?又如何才能获得引用型变量所指向的内存区域的大小呢?

解决方案 »

  1.   

    System.Runtime.InteropServices.Marshal.SizeOf()
    返回一个结构的大小
      

  2.   

    struct a
    {
    public a1;
    }
    a obja = new a();
    sizeof(obja);
      

  3.   

    serversql兄,
        你这段演示代码我无法在vs中编译通过,c#中,sizeof不能这样用di。copico兄,
        你给出了一个方法,但是我用不来,能否给个演示?
      

  4.   

    对于c#中的值类型数据的大小,我知道如何使用sizeof运算符来得到其对应的大小,但是对于引用类型,如:数组、class、string,我却没有办法得到其大小,更无法得到其所引用的内容的大小。
    如下,我定义了一个Test类,
    public class Test
    {
    public int i;
    public int get_i()
    {
    return i;
    }
    }并在Main函数中创建了这个类的实例,
    public class MyClass
    {
    public static void Main()
    {
    Test t = new Test();
    int size = Marshal.SizeOf(t.GetType());
    Console.WirteLine(size.ToString());
    }
    Console.ReadLine();
    }}MSDN上对Marshal.SizeOf的资料如下:
    返回对象的非托管大小(以字节为单位)[C#] public static int SizeOf(object);
    返回非托管类型的大小(以字节为单位)[C#] public static int SizeOf(Type);然而,无论是SizeOf(t.GetType()),还是SizeOf(t),或者是其他的数组、string等引用型变量,都是说“类型 Test 不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。”。所以,哪位能告诉我,该如何像c/c++那样,得到数组或引用型变量本身即其所引用的内容的大小?
      

  5.   

    sizeof(Type);
    not 
    sizeof(Instance);
    比如:
    unsafe
    {
    Console.WriteLine(sizeof(int));
    }
      

  6.   

    to 所以,哪位能告诉我,该如何像c/c++那样,得到数组或引用型变量本身即其所引用的内容的大小?在c#中,数组是分配在堆中,即和引用类型的变量一样,因此不能想c/c++中那样简单获得。
      

  7.   

    To deadshot123:
        我知道sizeof只能用于值类型,不能直接用变量名,而这正是我的问题所在:因为我知道某一个引用型的变量所占用的内存大小以及他所引用的内容所占用的内存的大小。
    To Knight94:
        我现在很清楚在c#中不能简单的通过sizeof运算符来取得数组、string等引用型变量本身及其所引用的内容的大小,所以我才发帖子询问啊,不知道有没有办法可以解决?
      

  8.   

    to 我现在很清楚在c#中不能简单的通过sizeof运算符来取得数组、string等引用型变量本身及其所引用的内容的大小,所以我才发帖子询问啊,不知道有没有办法可以解决?如果只是数组和string的话,你可以自己去计算;
    数组:length * sizeof( basetype )
    string: yourString.Length * sizeof( char )
      

  9.   

    我也想问,
    Marshal.SizeOf()
    只能用于非托管对象.托管对象的大小如何取得?
      

  10.   

    结构定义加上这样的属性,就可以用sizeof取大小了,跟c/c++里的一样,但前提是没有托管类型的成员。
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
      

  11.   

    to Knight94:
        这种方法的确也是可以达到一样的效果,只是如果是针对自定义的class或用自定义的class声明的对象呢?这时候又该怎么办?
    to zahuifan:
        原来也有兄弟碰到同样的问题啊,我还以为就我一个人搞不定这个问题呢。
        之所以会提出这个问题,是因为自己在尝试写一个组合函数的时候想看看自己的方法到底耗用了多少空间。若在c/c++中,这个自然方便,可转到c#上来就是贪图它的类型安全和其他一些便捷的特性,谁曾想,还会碰到这样的问题?
        虽然可以自己估算出来,但感觉总归是不太爽,所以就发帖子问了问,因为自己搞不定呵。兄弟要帮我顶一下啊~~~!
    to soaringbird:
        感谢你的提示,这一属性我会再去研究看看,但是按你所说,这一方法似乎是针对非托管类型的类,是不是?那不知道非托管类型的对象实例是否可以?对于托管类型又该如何解决?
    to all:
        最后,想问一下,为什么微软没有在c#中提供像c/c++中sizeof那样方便的解决方法呢?就像对DLL提供了load方法但却没有提供对应的unload方法一样,是不是有什么原因啊?
      

  12.   

    to 这种方法的确也是可以达到一样的效果,只是如果是针对自定义的class或用自定义的class声明的对象呢?这时候又该怎么办?即使在c或者C++中计算class对象的大小,也是不容易,因为每个class的结构不一样,出现动态分配的东西,也需要逐个去计算。
      

  13.   

    to Knight94:
        如果是针对class中的属性的话,我想应该可以通过反射再结合你所说的方法来一个一个计算得到,但这样是不是就没有办法得到整个class所占用的空间呢?按我的理解,在class中,不时还有方法啊什么的吗?这一部分的大小又该怎样计算呢?
      

  14.   

    to Knight94:
        原来如此,看来这个问题还真是有够麻烦的说,是不是MS认为用c#进行开发的时候不大会需要考虑太多的内存的问题?
      

  15.   

    to 原来如此,看来这个问题还真是有够麻烦的说,是不是MS认为用c#进行开发的时候不大会需要考虑太多的内存的问题?是这样的,在c#中资源管理是由系统负责,本身不用主动去释放某些资源。
      

  16.   

    to Kinght94:
        我现在稍微有些明白了,不过我还有些糊涂的是:为什么MS提供了sizeof来对值类型的托管资源做计算,但却不提供引用型的呢?引用型有什么特别的地方的吗?
      

  17.   

    to codermarshel:
        谢谢兄弟的捧场。:-)to Knight94:
        在此谢谢Knight94的帮助,我总结一下,你看看我说的对不对:
        c#中的sizeof运算符只能针对值类型,任何引用类型(如数组、string、class)都不能使用,而且只能针对类型使用,不能针对对象实例使用。
        Marshal.SizeOf方法只能针对非托管类型,对于托管类型无法使用。
        以上两点MSDN中都有提及,换言之,c#和.Net天生没有替工对托管类型的引用型数据的大小的计算方法,只能自己估算了,是不是如此?
      

  18.   

    to 以上两点MSDN中都有提及,换言之,c#和.Net天生没有替工对托管类型的引用型数据的大小的计算方法,只能自己估算了,是不是如此?是这样的,而且很少在c#程序中去计算到底使用了多少空间,毕竟写的是托管程序,资源的释放不是自己程序去完成。
      

  19.   

    一个实战的例子
    http://blog.csdn.net/ByWangler/archive/2006/04/18/667718.aspx