gpt4 book ai didi

c# - x64 位 Azure 机器上 DateTimeOffset 的平均大小是多少?

转载 作者:行者123 更新时间:2023-11-30 13:14:36 25 4
gpt4 key购买 nike

我一直在尝试获取 DateTimeOffset 的大小struct 在我的代码中,以便我可以计算父对象的大小。问题是 sizeof 都不是运算符(operator)也不是 Marshal.SizeOf为此目的而工作的功能。

sizeof 将无法工作,因为我必须使用不安全标志进行编译,而此功能不足以作为这样做的理由。 Marshal.SizeOf 抛出异常:

Type 'System.DateTimeOffset' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed.

我已经放弃尝试像这样计算结构的大小,因为每一行攻击/博客文章都会出现​​一个或另一个错误。

谁能告诉我 64 位 Azure Web 服务器上 DateTimeOffset 的平均大小是多少?

最佳答案

接受的答案不正确,它忽略对齐。结构的大小不仅仅是其成员的总和。字段之间以及结构末尾可能需要额外的空间,以帮助处理器有效读取字段并实现 .NET 内存模型提供的原子性保证。

DateTimeOffset 更加复杂,编写 DateTimeOffset 结构的 Microsoft 程序员通过复制/粘贴 DateTime 结构开始编码时犯了一个大错误。它有一个历史错误,对 DateTimeOffset 来说很重要,因为它有两个字段而不是一个。它使用 LayoutKind.Auto 而不是 Sequential。在 Reference Source 中很容易看到

这为 CLR 提供了余地,可以在其运行的任何模式下将字段安排为最佳。在 32 位模式下,它不会将 Int64 对齐到 8 字节,就像通常那样, 但为 4 个字节。这减少了字段之间的填充,大小为 12 字节。

同样,在 64 位模式下,它喜欢将字段对齐到 8。这会在字段之间产生更多的填充。

查看此信息的唯一好方法是使用调试器。运行这段代码:

    static void Main(string[] args) {
var arr = new DateTimeOffset[] {
new DateTimeOffset(0x123456789abcdef0, TimeSpan.FromMinutes(60)),
new DateTimeOffset(0x123456789abcdef0, TimeSpan.FromMinutes(60)),
};
System.Diagnostics.Debugger.Break();
}

当断点命中时,使用 Debug > Windows > Memory > Memory1 并在地址框中键入 &arr[0] 查看数组内容。您会看到类似于以下内容的内容:

0x00000115DC4FBA30  3c 00 00 00 00 00 00 00 f0 76 f8 38 70 56 34 12  <.......ðvø8pV4.
0x00000115DC4FBA40 3c 00 00 00 00 00 00 00 f0 76 f8 38 70 56 34 12 <.......ðvø8pV4.
0x00000115DC4FBA50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

您可以轻松地看到 Offset 字段 (60 = 0x003c) 和 DateTime 字段。我调整了窗口的大小,使 2 个元素变得明显,它在你的机器上看起来不会那么干净 :) 但只需计算字节直到它们重复,DateTimeOffset 在 64 位中需要 16 个字节模式。

32 位和 64 位模式之间的大小不同这一事实通常会让您很担心。这个错误永远不需要修复,DateTimeOffset 没有合理的互操作故事,它永远不会匹配等效的非托管类型。它是 WinRT(又名 UWP)中指定的互操作类型,但 CLR 中内置的语言投影隐藏了这个问题。

关于c# - x64 位 Azure 机器上 DateTimeOffset 的平均大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38730943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com