- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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++代码
您可能关注的文档
- 备考2009高考语文二轮学案:晨读材料(十四).doc
- 备考英语四级五绝招:想不考高分都难.doc
- 复习课《探索规律》.doc
- 复习资料综合.doc
- 复旦8教授联名请求录取一落榜天才.doc
- 复活 欧也妮 测试.doc
- 夏惟桐:南审辩论请缓一缓.doc
- 复活简介.doc
- 复旦公布09招生计划 沪上一本校本地招生数缩减.doc
- 夏日美白.doc
- 实验室危废随意倾倒查处规范.ppt
- 实验室危废废液处理设施规范.ppt
- 实验室危废处置应急管理规范.ppt
- 初中地理中考总复习精品教学课件课堂讲本 基础梳理篇 主题10 中国的地理差异 第20课时 中国的地理差异.ppt
- 初中地理中考总复习精品教学课件课堂讲本 基础梳理篇 主题10 中国的地理差异 第21课时 北方地区.ppt
- 危险废物处置人员防护培训办法.ppt
- 危险废物处置隐患排查技术指南.ppt
- 2026部编版小学数学二年级下册期末综合学业能力测试试卷(3套含答案解析).docx
- 危险废物处置违法案例分析汇编.ppt
- 2026部编版小学数学一年级下册期末综合学业能力测试试卷3套精选(含答案解析).docx
最近下载
- 2025年上海市中考英语试题卷(含答案).docx
- 《2025年长护险机构服务标准化与质量控制体系》.docx
- 海南省2021-2022学年高二上学期期末学业水平诊断化学试题(原卷版)-精品.docx VIP
- 2025年 AMC 8 数学竞赛(中英双语)-学生用卷.doc VIP
- 2023年重庆三峡学院公共课《马克思主义基本原理概论》期末试卷B(有答案).docx VIP
- 西师版数学六年级上册知识点.doc VIP
- 氢气膨胀机的开发及应用.pdf VIP
- 2024-2025学年广东省深圳市龙华区八年级(上)期末语文试卷.docx VIP
- 2022年度工作总结模板.docx VIP
- 年产2000吨刺梨,金秋梨复合果酒工厂车间毕业设计.docx VIP
原创力文档


文档评论(0)