我正在研究结构;如果实例大小小于 16字节,有些书会建议创建struct。
为什么?
感谢您的回复。
答案 0 :(得分:31)
这是因为16个字节是编译器开始将结构复制为内存块而不是使用一个或两个简单移动指令的阈值。
编译器在结构很小时优化复制。例如,八个字节的结构可以作为单个64位值复制。 16字节的结构可以复制为一个或两个奇异值(取决于处理器体系结构)。当结构大于16个字节时,编译器不再尝试优化移动,而后退是调用复制内存块的方法。
(注意:16字节的阈值可能会有所不同,具体取决于编译器的版本,似乎它实际上试图在新版本中超越该点进行优化,但优化后的代码仍会是很多移动指令,相比之下复制对仍然是单个移动操作的对象的引用。)
编辑:
以下是我在64位系统复制结构上进行了五十次测试的结果:
struct 4 : 272 ms.
struct 8 : 235 ms.
struct 16 : 317 ms.
struct 32 : 625 ms.
struct 64 : 1280 ms.
struct 128 : 4659 ms.
struct 256 : 8020 ms.
如您所见,16字节以下的时间不是线性的,虽然16字节是4字节的4倍,但不会花费4倍的时间。超过16个字节的时间是线性的,因此将大小加倍的时间加倍。这就是它开始使用多个动作的地方。超过64个字节有一个跳跃,当大小加倍时,时间突然增加四倍。这就是开始使用后备的地方。
答案 1 :(得分:1)
它不完全是16个字节,但是因为结构是按值传递的(每当你将它们提供给方法时复制,分配它们等)它们不能太大。如果是的话,通过参考传递东西会更便宜。
4年后:我对.NET的了解很少(仍然不太了解它)。当处理“多于或少于16个字节?”时,Guffa的答案显然更正确,因为在那个大小上,一点点复制应该不重要。在构建巨大的结构时,我的回答可能是要记住的。