为啥这个用于 C++ 的 .NET StructLayout 示例
Posted
技术标签:
【中文标题】为啥这个用于 C++ 的 .NET StructLayout 示例【英文标题】:Why this sample of .NET StructLayout for C++为什么这个用于 C++ 的 .NET StructLayout 示例 【发布时间】:2009-03-23 16:43:21 【问题描述】:来自http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute(VS.71).aspx:
[C++]
[StructLayout(LayoutKind::Explicit, Size=16, CharSet=CharSet::Ansi)]
__value class MySystemTime
public:
[FieldOffset(0)] short int wYear;
[FieldOffset(2)] short int wMonth;
[FieldOffset(4)] short int wDayOfWeek;
[FieldOffset(6)] short int wDay;
[FieldOffset(8)] short int wHour;
[FieldOffset(10)] short int wMinute;
[FieldOffset(12)] short int wSecond;
[FieldOffset(14)] short int wMilliseconds;
;
这是我的想象,还是方括号中的元素与 C++ 语法不一致?
当 C++ 提供了足够的工具来在语言的标准定义中指定结构布局时(也许还有通常支持的 #pragma pack() ),为什么还要麻烦做所有这些。语言中设计的兼容性不能保证您可以在 C++ 中定义任何可以在 C 中定义的结构吗?我理解需要能够用其他语言显式描述 C 结构的布局,但似乎没有必要使用 C++ 提供
extern "C"
【问题讨论】:
【参考方案1】:方括号中的东西称为属性,经常出现在C#代码中。它们在这里似乎具有相同的含义,因为这不是严格的 C++。它具有 Microsoft 扩展以允许与 CLI 集成。
当您在 C 或 C++ 中声明这样的结构时,这并不能保证特定的内存布局。要控制它,您需要特殊的编译指示来控制“打包”。这些是特定于平台的。所以你在这里看到的只是 CLR 的等价物。
更新:该示例来自旧版本的 Microsoft CLI 集成 C++ 文档,称为托管 C++。它很快就被放弃了,并在下一个版本中被C++/CLI 取代——将 CLI 功能移植到 C++ 中,它是如此完整和广泛,它实际上变成了一种不同的语言,就像 C++ 是一种不同于 C 的语言一样。
【讨论】:
以上是关于为啥这个用于 C++ 的 .NET StructLayout 示例的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个算法在 python 中的运行速度比在 C++ 中快得多?