c#

位置:IT落伍者 >> c# >> 浏览文章

成员名称说明Sequential对象的成员按照它们在被导出到非托管内存时出现的顺序依次布局这些成员根据在StructLayoutAttribute::Pack中指定的封装进行布局并且可以是不连续的Explicit对象的各个成员在非托管内存中的精确位置被显式控制每个成员必须使用FieldOffsetAttribute指示该字段在类型中的位置Auto运行库自动为非托管内存中的对象的成员选择适当的布局使用此枚举成员定义的对象不能在托管代码的外部公开尝试这样做将引发异常

这就是控制对象转化为非托管代码时占用内存固定这样我们就可以舒服的使用MarshalSizeOf方法了得到一个对象的大小如果一个对象中还包含另外一个对象那么另外一个对象可以使用这个[StructLayout(LayoutKindSequential)]也可以不使用如果使用则是该对象的大小加上这个对象的大小;如果不使用则是该对象的大小加上个字节(就是这个对象引用大小)

当想获取一个集合的大小时候我们不能在List上加这个属性因为微软的dll中的类那么我们怎么样才能获取对应的大小呢?其实还用一种简单的方式就是将对象或者集合转化成内存流再获取内存流的大小就ok了虽然有一些其他影响大小但基本上可以正确的粗略估计一个对象在内存的大小或者比较俩个对象集合的大小的!

主要代码

BinaryFormatter binaryFormatter = new BinaryFormatter();

MemoryStream stream = new MemoryStream();

binaryFormatterSerialize(stream personList);

streamSeek( SeekOriginBegin);

其实里面东西多着的我仅仅了解了一点点分享一下大家一起讨论一下如果有错误请批评指出!

               

.NET对象占内存多少


发布日期:2018年09月21日
 
.NET对象占内存多少

一直有一个小小的疑惑——NET一个对象或者一个集合占多少内存?有没有很快速的方法获取而不是简单的估计分析对象大小?

查了MSDN和一些其他人的分析得到解决是托管代码对象的大小无法真实的得到因为存在托管对象转化成非托管的CLR优化但我仍然不死心非要弄个究竟!好吧最终得到一些结果了

sizeof关键字用于获取值类型的大小如int(占个字节)char(个字节);并且sizeof 运算符仅适用于值类型而不适用于引用类型所以针对对象改关键字无法使用

查阅msdn发现对象MarshalSizeOf 方法解释为返回类的非托管大小;但是仍然不能使用因为针对的是非托管代码如果直接使用一个类的对象会报一个错误不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量;这是因为对象在内存中实际大小并不是固定的可能这次运行一个值下次就是另外一个值了存在优化!

所以为了固定一个对象的大小必须告诉CLR不优化对象在内存中的大小这就需要在声明类的时候加上[StructLayout(LayoutKindSequential)]这个特性;

StructLayoutAttribute 类使用户可以控制类或结构的数据字段的物理布局

LayoutKind 枚举 控制当导出到非托管代码时对象的布局

上一篇:C#数据回滚实例

下一篇:.net连接Mysql封装类代码 可直接调用