【发布时间】:2011-02-25 03:41:04
【问题描述】:
来自规范 10.5.3 Volatile fields:
volatile 字段的类型必须是以下之一:
引用类型。
类型字节、sbyte、short、ushort、 int, uint, char, float, bool, System.IntPtr 或 System.UIntPtr。
具有枚举基类型的枚举类型 字节,sbyte,short,ushort,int, 或单位。
首先我想确认我的理解是正确的:我猜上述类型可能是易失的,因为它们在内存中存储为一个 4 字节的单元(对于引用类型,因为它的地址),这保证了读/写操作是原子的。 double/long/etc 类型不能是 volatile,因为它们不是原子读/写,因为它们在内存中超过 4 个字节。我的理解正确吗?
第二个,如果第一个猜测是正确的,为什么用户定义的结构中只有一个int 字段(或类似的东西,4 字节就可以)不能是易失性的? 理论上它是原子的,对吗?或者仅仅因为所有用户定义的结构(可能超过 4 个字节)都不允许 volatile设计?
【问题讨论】:
-
见 stackoverflow.com/questions/4727068/…(阅读 Eric Lippert 对他的回答的评论)
-
@The Scrum Meister:感谢您提供的链接,它完美地回答了我的第一个问题。但是第二个呢?为什么 C# 中 4 字节的用户定义结构不能是 volatile 的?
-
@Danny 可能是因为他们想让它变得简单。请记住
Typically, the common language runtime controls the physical layout of the data fields of a class or structure in managed memory.(msdn.microsoft.com/en-us/library/…),因此除非您使用StructLayoutAttribute,否则您无法确定结构的布局。 -
@xanatos:我也认为他们想让事情变得简单。但不太确定,所以我希望有人能提供一个规范的证据,以防我在接下来的重要采访中被问到这个问题。
-
@Danny A IntPtr 是
native (platform-specific) size integerstackoverflow.com/questions/1148177/…
标签: c# .net clr language-features volatile