【发布时间】:2016-07-17 15:37:04
【问题描述】:
我偶然发现了以下内容,摘自本书
Joseph Albahari 和 Ben Albahari (O'Reilly) 的 C# 6.0 简述。
版权所有 2016 Joseph Albahari 和 Ben Albahari,978-1-491-92706-9。
我没有看到那里提到它,但是根据经验,它不会遵循 - 您应该始终按照大小的降序声明类型中的变量,以便避免内存浪费被指出?
我的意思是,如果我做对了,我们通常都应该在设计类型时考虑到这一点。
更新:
我想出了下面的sn-p来证明上面是对还是错。然而,我预计 S2 的大小会有所不同(以支持书中所说的)。
public struct S1
{
public byte b;
public long l;
}
public struct S2
{
public long l;
public byte b;
}
[StructLayout(LayoutKind.Explicit, Size = 9)]
public struct S3
{
[FieldOffset(0)]
public byte b;
[FieldOffset(1)]
public long l;
}
S1 s1 = new S1();
S2 s2 = new S2();
S3 s3 = new S3();
Console.WriteLine(System.Runtime.InteropServices.Marshal.SizeOf(s1)); //prints 16
Console.WriteLine(System.Runtime.InteropServices.Marshal.SizeOf(s2)); //prints 16
Console.WriteLine(System.Runtime.InteropServices.Marshal.SizeOf(s3)); //prints 9
【问题讨论】:
-
"在您的类型中按大小降序排列" 不完全。从包装的角度来看,
short, short, int, long和long, int, short, short一样好。请记住,优化数据以减少内存可能会对性能产生重大影响。 -
@AlexD:感谢您的补充。您能否详细说明不浪费内存并遵循上述指南会对性能产生重大影响?
-
我很确定 CPU 不喜欢处理小于字大小的数据,因此虽然您可以节省空间,但性能会受到影响
-
那么(你们两个),从你们的角度来看——这种行为/知识的意义是什么?
-
@Veverke 这取决于硬件。粗略地说,当您从内存中读取一个字节时,周围的一些字节也会被读取/缓存。因此,如果您有
byte x, byte y并一个接一个地访问它们,它可能会比byte x, long, long, long, byte y快得多。但这是一个单独的主题:)。