如何在C#中模拟C++的联合.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何在C#中模拟C的联合

如何在C#中模拟C++的联合 如何在C#中模拟C++的联合(Union)?[C#, C++] 0 如何阅读本文? 如果你... ?...希望了解联合的概念,请阅读“什么是联合?”。 ?...希望了解联合的内存使用情况,请阅读“联合的内存布局与内存使用情况。”。 ?...希望了解如何在C#中模拟联合,请阅读“第一次尝试:在C#中模拟这种布局方式。”。 ?...希望了解在C++中使用联合有哪些要注意的地方,请阅读“在实际的C++代码中,我们是如何使用联合的?”。 ?...希望了解如何在C#中更好的使用模拟的联合,请阅读“第二次尝试:改进型的联合模拟。”。 ?...希望了解在C#中使用模拟的联合有些什么注意事项,请阅读“别在模拟的联合中同时使用值类型和引用类型!”。 ?...希望了解为何我要写这篇文章,请阅读“为什么要在C#里面模拟这个用处不大的东西?”。 否则... ?...你应该从头到尾阅读全文。 1 什么是联合? 联合(Union)是一种特殊的类,一个联合中的数据成员在内存中的存储是互相重叠的。每个数据成员都在相同的内存地址开始。分配给联合的存储区数量是“要包含它最大的数据成员”所需的内存数。同一时刻只有一个成员可以被赋给一个值。 下面我们来看看C++中如何表达联合: // Code #01 union TokenValue { char _cval; int _ival; double _dval; }; 2 联合的内存布局与内存使用情况。 下面我们来考察一下TokenValue的内存布局。 首先,我们使用sizeof运算符来获取该联合各个成员的内存占用字节数: // Code #02 int _tmain(int argc, _TCHAR* argv[]) { cout sizeof(char): sizeof(char) endl; cout sizeof(int): sizeof(int) endl; cout sizeof(double): sizeof(double) endl; return 0; } /**//* * Output: * sizeof(char): 1 * sizeof(int): 4 * sizeof(double): 8 * */ 这样,分配给该联合的内存就是8个字节。 接着,我们来看看具体使用该联合时,所分配的内存的字节占用情况如何: // Code #03 int _tmain(int argc, _TCHAR* argv[]) { TokenValue tv; // [_][_][_][_][_][_][_][_] tv._cval = K; // [X][_][_][_][_][_][_][_] tv._ival = 1412; // [X][X][X][X][_][_][_][_] tv._dval = 3.14159; // [X][X][X][X][X][X][X][X] return 0; } 3 第一次尝试:在C#中模拟这种布局方式。 在C#中,要指定成员的内存布局情况,我们需要结合使用StructLayoutAttribute特性、LayoutKind枚举和FieldOffsetAttribute特性,它们都位于System.Runtime.InteropServices命名空间中。 下面我用struct来试着模拟上面的TokenValue联合: // Code #04 [StructLayout(LayoutKind.Explicit, Size=8)] struct TokenValue { [FieldOffset(0)] public char _cval; [FieldOffset(0)] public int _ival; [FieldOffset(0)] public double _dval; } 我们知道,联合的每个数据成员都在相同的内存地址开始,通过把[FieldOffset(0)]应用到TokenValue的每一个成员,我们就指定了这些成员都处于同一起始位置。当然,我们得事先告诉.NET这些成员的内存布局由我们来作主,把LayoutKind.Explicit枚举传递给StructLayoutAttribute特性的构造函数,并应用到TokenValue,.NET就不会再干涉该struct的成员在内存中的布局了。另外,我显式的把TokenValue的大小设置为8字节,当然,这样做是可选的。 4 在实际的C++代码

文档评论(0)

sy78219 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档