~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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#中如何才能获得引用型变量所占用的内存区域的大小?又如何才能获得引用型变量所指向的内存区域的大小呢?
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#中如何才能获得引用型变量所占用的内存区域的大小?又如何才能获得引用型变量所指向的内存区域的大小呢?
解决方案 »
- toolstrip 的新增按钮代码在哪里? 如何把两个不同的datagirdview更新到两个表里
- 存储过程返回值的一个小问题
- Toolbar控件按钮图片背景色(与ImageList绑定)与按钮的背景色不一致,如何处理?
- listbox问题和正则表达式问题请帮忙!
- 关于MDI子窗体的实例化问题求助~~~请各位大仙关注一下~~~~~~~~···
- metro中怎么取到一个文件下的所有文件
- 数据库查询语句问题
- 简单的DataGridView绑定问题
- c#水晶报表打印的问题
- 有哪位高手愿意加我QQ好友?
- c# socket客户服务编程中,如何 传送数组?或非string数据那?
- datagrid中的模板列是做什么用的,哪位能给举个例子
返回一个结构的大小
{
public a1;
}
a obja = new a();
sizeof(obja);
你这段演示代码我无法在vs中编译通过,c#中,sizeof不能这样用di。copico兄,
你给出了一个方法,但是我用不来,能否给个演示?
如下,我定义了一个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++那样,得到数组或引用型变量本身即其所引用的内容的大小?
not
sizeof(Instance);
比如:
unsafe
{
Console.WriteLine(sizeof(int));
}
我知道sizeof只能用于值类型,不能直接用变量名,而这正是我的问题所在:因为我知道某一个引用型的变量所占用的内存大小以及他所引用的内容所占用的内存的大小。
To Knight94:
我现在很清楚在c#中不能简单的通过sizeof运算符来取得数组、string等引用型变量本身及其所引用的内容的大小,所以我才发帖子询问啊,不知道有没有办法可以解决?
数组:length * sizeof( basetype )
string: yourString.Length * sizeof( char )
Marshal.SizeOf()
只能用于非托管对象.托管对象的大小如何取得?
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
这种方法的确也是可以达到一样的效果,只是如果是针对自定义的class或用自定义的class声明的对象呢?这时候又该怎么办?
to zahuifan:
原来也有兄弟碰到同样的问题啊,我还以为就我一个人搞不定这个问题呢。
之所以会提出这个问题,是因为自己在尝试写一个组合函数的时候想看看自己的方法到底耗用了多少空间。若在c/c++中,这个自然方便,可转到c#上来就是贪图它的类型安全和其他一些便捷的特性,谁曾想,还会碰到这样的问题?
虽然可以自己估算出来,但感觉总归是不太爽,所以就发帖子问了问,因为自己搞不定呵。兄弟要帮我顶一下啊~~~!
to soaringbird:
感谢你的提示,这一属性我会再去研究看看,但是按你所说,这一方法似乎是针对非托管类型的类,是不是?那不知道非托管类型的对象实例是否可以?对于托管类型又该如何解决?
to all:
最后,想问一下,为什么微软没有在c#中提供像c/c++中sizeof那样方便的解决方法呢?就像对DLL提供了load方法但却没有提供对应的unload方法一样,是不是有什么原因啊?
如果是针对class中的属性的话,我想应该可以通过反射再结合你所说的方法来一个一个计算得到,但这样是不是就没有办法得到整个class所占用的空间呢?按我的理解,在class中,不时还有方法啊什么的吗?这一部分的大小又该怎样计算呢?
原来如此,看来这个问题还真是有够麻烦的说,是不是MS认为用c#进行开发的时候不大会需要考虑太多的内存的问题?
我现在稍微有些明白了,不过我还有些糊涂的是:为什么MS提供了sizeof来对值类型的托管资源做计算,但却不提供引用型的呢?引用型有什么特别的地方的吗?
谢谢兄弟的捧场。:-)to Knight94:
在此谢谢Knight94的帮助,我总结一下,你看看我说的对不对:
c#中的sizeof运算符只能针对值类型,任何引用类型(如数组、string、class)都不能使用,而且只能针对类型使用,不能针对对象实例使用。
Marshal.SizeOf方法只能针对非托管类型,对于托管类型无法使用。
以上两点MSDN中都有提及,换言之,c#和.Net天生没有替工对托管类型的引用型数据的大小的计算方法,只能自己估算了,是不是如此?
http://blog.csdn.net/ByWangler/archive/2006/04/18/667718.aspx