【问题标题】:Calculate padding of unmanaged table计算非托管表的填充
【发布时间】:2014-01-13 21:43:10
【问题描述】:

MIB_IPNETTABLE 的docs 说:

MIB_IPNETTABLE 结构可能包含用于对齐的填充 dwNumEntries 成员和第一个 MIB_IPNETROW 数组条目 表成员。对齐 的填充也可能存在于 表成员中的 MIB_IPNETROW 数组条目。任何访问 MIB_IPNETROW 数组条目应假定可能存在填充。

Marshal.SizeOf(typeof(MIB_IPNETROW))

照顾好了吗?如果不是 - 我怎么知道存在多少填充以解决它。如果是 - 它会在 x64 上正常工作吗(请参阅 64 Bit P/Invoke Idiosyncrasy )?

【问题讨论】:

  • 那个文档评论对我来说毫无意义。我看不到任何填充可能来自哪里。
  • @DavidHeffernan A)谢谢。 B)根据问题最后一行的链接 - 它确实发生了。 (至少根据那里的答案。)
  • 这个问题具有误导性。我在那里留下了评论。
  • @DavidHeffernan 我认为您在评论中的意思是“表 内联数组”。再次感谢。
  • 是的,我就是这个意思。

标签: c# c++ .net winapi pinvoke


【解决方案1】:

MIB_IPNETROWMIB_IPNETTABLE 在 x86 和 x64 上的对齐方式是 4。这可以通过查看结构成员的对齐方式来推断。而对于数组,元素之间不会有填充,因为数组元素之间永远不会有填充。

因此在这些平台上根本不会有填充,而且实际上两个平台上的布局是相同的。

我无法解释为什么文档会谈到填充。也许在 Alpha 或 Itanium 上会有填充,但在 x86 和 x64 上没有。或者文档可能是错误的。

【讨论】:

  • 谢谢。 ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
  • 我知道没有没有填充。但是,在有填充的情况下(如果它存在于 Itanium / 其他结构中) - 如何处理 can - 我们如何知道要跳过哪些字节?
  • 为了回答需要对为什么存在填充有一些了解。我看不出任何地方都存在填充的理由。我认为文档是错误的。
  • 好的。谢谢。​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
猜你喜欢
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2017-12-28
  • 2013-09-11
相关资源
最近更新 更多