C# 传递结构是否比传递其成员占用更多内存/开销?

C# 传递结构是否比传递其成员占用更多内存/开销?,c#,struct,overhead,C#,Struct,Overhead,我有一些资源敏感的东西要写。我想知道,与仅仅将这些变量一起传递(例如作为函数参数)相比,在结构中将变量分组在一起是否会导致内存开销 如果是这样的话,有什么好的方法可以帮助您在不增加开销的情况下创建基于惰性值的东西?e、 现在我有一个IEnumerable,其中Foo是一个有几个成员的结构。我假设这与IEnumerable相同,但是如果创建结构会产生额外的开销,我如何避免呢?使用[members]调用回调是否会减少开销 谢谢 A是一个泛型类--A。因此,当你 Tuple.Create(a, b,

我有一些资源敏感的东西要写。我想知道,与仅仅将这些变量一起传递(例如作为函数参数)相比,在结构中将变量分组在一起是否会导致内存开销

如果是这样的话,有什么好的方法可以帮助您在不增加开销的情况下创建基于惰性值的东西?e、 现在我有一个
IEnumerable
,其中
Foo
是一个有几个成员的结构。我假设这与
IEnumerable
相同,但是如果创建结构会产生额外的开销,我如何避免呢?使用
[members]
调用回调是否会减少开销

谢谢

A是一个泛型类--A。因此,当你

Tuple.Create(a, b, c, ...)
您正在托管堆上分配和实例化一个类。这样做之后,您就可以传递对该对象的托管引用,该引用本身很小—32位进程上为4字节,64位进程上为8字节。这使得调用很快,但实例化可能很慢。它还可以给垃圾收集器增加内存压力——如果您在大量数据集合中进行迭代,可能会有很大的压力

A是一种值类型。它们总是嵌入到某个更大的上下文中——要么是堆栈,要么是某个类。它们将作为副本传递,除非在此时将它们复制到堆中。幸运的是,在处理结构或其他值类型的泛型枚举时,这些类型——这是c#中泛型的基本设计要求之一。因此,在结构上枚举将导致很少的内存压力,但可能会在复制周围的内容时产生额外的成本

至于构造一个结构所需的时间,没有理由比构造一个等价类所需的时间更长。我的观察结果是,有些类的构造可能很慢,但这是因为构造函数或工厂方法中有大量代码,而不是因为结构本身就很慢。(但请看哪一点指出了在使用具有只读字段的结构时可能出现的一个小性能问题。)

因此,在决定是在结构还是元组上迭代时,内存压力和构造时间(元组可能更高)与调用和内存复制成本(结构更高)之间存在权衡。我的经验是,对于大量的小对象集合(比如指针对),使用
struct
进行迭代会更快,但软件中不同的细节可能会产生不同的结果。确定哪种成本更低的唯一方法是使用轮廓仪进行实际测量

然而,我不确定我会推荐这样做。我建议您尽可能以最自然、最直接的方式编写代码,而不要过多地担心最初的点优化。如果您已经有了struct
Foo
,并将其作为参数传递给许多方法,请继续使用它。如果有很多代码需要并使用通用元组,请改用它们。小数据转换的性能成本可能会堆积起来,并淹没您使用迭代器进行的任何优化。

A是一个通用类——A。因此,当你

Tuple.Create(a, b, c, ...)
您正在托管堆上分配和实例化一个类。这样做之后,您就可以传递对该对象的托管引用,该引用本身很小—32位进程上为4字节,64位进程上为8字节。这使得调用很快,但实例化可能很慢。它还可以给垃圾收集器增加内存压力——如果您在大量数据集合中进行迭代,可能会有很大的压力

A是一种值类型。它们总是嵌入到某个更大的上下文中——要么是堆栈,要么是某个类。它们将作为副本传递,除非在此时将它们复制到堆中。幸运的是,在处理结构或其他值类型的泛型枚举时,这些类型——这是c#中泛型的基本设计要求之一。因此,在结构上枚举将导致很少的内存压力,但可能会在复制周围的内容时产生额外的成本

至于构造一个结构所需的时间,没有理由比构造一个等价类所需的时间更长。我的观察结果是,有些类的构造可能很慢,但这是因为构造函数或工厂方法中有大量代码,而不是因为结构本身就很慢。(但请看哪一点指出了在使用具有只读字段的结构时可能出现的一个小性能问题。)

因此,在决定是在结构还是元组上迭代时,内存压力和构造时间(元组可能更高)与调用和内存复制成本(结构更高)之间存在权衡。我的经验是,对于大量的小对象集合(比如指针对),使用
struct
进行迭代会更快,但软件中不同的细节可能会产生不同的结果。确定哪种成本更低的唯一方法是使用轮廓仪进行实际测量


然而,我不确定我会推荐这样做。我建议您尽可能以最自然、最直接的方式编写代码,而不要过多地担心最初的点优化。如果您已经有了struct
Foo
,并将其作为参数传递给许多方法,请继续使用它。如果有很多代码需要并使用通用元组,请改用它们。小数据转换的性能成本可能会堆积起来,淹没您使用迭代器进行的任何优化。

担心不存在的问题。。(我认为结构可能“更快”,这取决于其他因素,包括成员