C#结构内存布局介绍
转载:http://www.csharpwin.com/csharpspace/10455r2800.shtml
本来打算写一篇文章,详细地讨论一下结构的内存布局,但是想了下,跟路西菲尔的这篇文章也差不多,所以这里只做一下补充:
一、对齐长度
如果没有显式的指定对齐长度,将以结构中占用空间最大的成员的长度作为对齐长度;如果要显式指定对齐长度,需设置StructLayoutAttribute.Pack,如:
[StructLayout(LayoutKind.Sequential,Pack=4)]
struct MyStruct
{ }
对齐长度的作用在于:如果某个字段的长度大于或等于对齐长度,则对齐长度没用;如果小于对齐长度,则以对齐长度为单元,占用的空间是对齐长度的整数倍,同时保证不大于对齐长度的字段一定分配在同一单元,并且其首地址一定是字段长度的整数倍。
如:
struct MyStruct
{
byte a;
char b;
int c;
}第0个字节为a,第1个字节无数据,第2,3个字节为b,第4,5,6,7为c。
二、“诡异”的decimal类型
有这样一个结构,请问其占用空间是多少?
struct MyStruct
{
int a;
decimal b;
double c;
}
最初我以为是48个字节,因为int是4个字节,decimal是16个字节,double是8个字节,decimal最大,所以以16个字节对齐,所以是48个字节。
但实际上是32个字节。
这其中的原因在于,decimal是由4个int构成的:
struct Decimal
{
private int flags;
private int hi;
private int lo;
private int mid;
.....//其他不占据对象内存的成员
}
所以上述结构中占内存最大的成员是double,对齐长度是8
三、.Net中实现C语言的Union
可以通过下面的自定义字段位置的方法,在.Net中实现C风格的Union
[StructLayout(LayoutKind.Explicit)]
struct MyStruct
{
[FieldOffset(0)]
int a;
[FieldOffset(2)]
short b;
[FieldOffset(3)]
byte c;
}
从0开始计数,第2个字节为a,b共用,第3个字节为a,b,c共用。
C#结构内存布局介绍的更多相关文章
- VC中结构体的内存布局
看了 VC++中内存对齐 这篇文章,感觉说复杂了,根据我的总结,要算出结构体的内存大小和偏移量,只要清楚结构体各成员的内存布局就行了,下面介绍一下我总结的规则,有不对之处,欢迎回复. 1.实际PACK ...
- c++对象模型是什么,对象的内存布局和结构问题
在c++发明的初期对于c++对象模型的争论从来没有停止过直到标准委员会通过了最终的c++对象模型这件事情才变得尘埃落定.C++对象模型可能是最不需要去解释的,但是又是不得不去说的因为c++的入门最先接 ...
- C语言结构体及其内存布局
code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...
- 图说C++对象模型:对象内存布局详解
0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看. 本文的结论都在VS2013上得到验证.不同的编译器在内存布局的细节上可能有 ...
- c++继承中的内存布局
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化 译 译者前言 一个C ...
- c++ 对象内存布局详解
今天看了的,感觉需要了解对象内存的问题.参考:http://blog.jobbole.com/101583/ 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个 ...
- c++对象内存布局
这篇文章我要简单地讲解下c++对象的内存布局,虽然已经有很多很好的文章,不过通过实现发现有些地方不同的编译器还是会有差别的,希望和大家交流. 在没有用到虚函数的时候,C++的对象内存布局和c语言的st ...
- C/C++内存布局及对齐
1.源文件转换为可执行文件 源文件经过以下几步生成可执行文件: 1.预处理(preprocessor):对#include.#define.#ifdef/#endif.#ifndef/#endif等进 ...
- 好文章系列C/C++——图说C++对象模型:对象内存布局详解
注:收藏好文章,得出自己的笔记,以查漏补缺! ------>原文链接:http://blog.jobbole.com/101583/ 前言 本文可加深对C++对象的内存布局.虚表指针.虚 ...
随机推荐
- Exception Handling Statements (C# Reference)
Exception Handling Statements (C# Reference) C# provides built-in support for handling anomalous sit ...
- oracle命中率模型计算
命中率模型是在owi之前比较常用的一种诊断性能问题的方法,通过命中率的计算,发现系统中的一些设置是否合理,当命中率不高的时候,通过调整一些参数和设置,提高命中率,有效的提高系统的性能和吞吐量.但当系统 ...
- bzoj1202
很久以前写的,忘补解题报告了首先似乎dfs就可以了吧?但还有更高大上的做法其实这东西就是告诉sum[y]-sum[x-1]=z然后给出一堆看成不成立可以用并查集,维护每个点到father点的差即可 . ...
- (转载)puremvc框架之proxy
(转载)http://www.cnblogs.com/yjmyzz/archive/2010/08/01/1789769.html 上一篇 puremvc框架之Command 里,已经学习了如何利用C ...
- 畅通工程 HDOJ--1863
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- ftp服务器测试
前台传递字符串reqbuf: ftp服务器IP\r\n端口\r\n用户名\r\n密码\r\nftp路径\r\n\r\n 解析reqbuf,重新组装成系统命令,去执行ftptest.sh脚本, 调用sy ...
- C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)
转载地址 : http://blog.csdn.net/21aspnet/article/details/6729724 一.概念 对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它 ...
- Yii 安装二维码扩展Qrcode
比如要添加 https://github.com/2amigos/yii2-qrcode-helper 生成二维码的 这个扩展第一种方法 : 1.打开根目录的composer.json, 在re ...
- (转)Zend Studio 10.6.1破解注册图文详解
原文来自:http://www.softown.cn/soft/zend-studio/windows/10.6.1#downloads 下面我们以Zend Studio 10.6.1正式版为例来介绍 ...
- DS18B20测温
项目需要实现分布式大规模测温,需要52个测温点,采样DS18B20进行设计. 30cm一个点,一共8个点串联.采用国标单芯单股纯铜硬线BV0.5做导线,测试一会儿正常,一会儿不正常.后面换线了,测试正 ...