c# - 无数据类型的开销是多少?

标签 c# .net class overhead

我不想就微优化发起一场激烈的 war ,但我对某些事情感到好奇。

创建没有内部数据的类型的实例在内存和性能方面的开销是多少?

例如,一个实现了IComparer<T>的简单类可能只包含一个 Compare方法,没有属性或字段。

class FooComprarer : IComparer<Foo>
{
    public int Compare (Foo x, Foo y) 
    {
        // blah, blah
    }
}

我见过的典型示例代码只是调用 new FooComparer() ,只要需要其中之一。

我无法想象这里的实例化成本是多少,但我很想知道它到底是什么。以及它与维护比较器类型字典的静态工厂类相比如何,以便一个比较器实例可以在需要的任何地方使用。

最佳答案

有一些开销,但与您要使用比较器的目的相比,它可能可以忽略不计。

在 32 位和 64 位系统上,该实例将使用 16 字节的堆空间。开销是两个指针,在32位系统上使用8个字节,在64位系统上使用16个字节。但是,32位系统中的内存管理器不能分配小于16字节的 block ,所以 block 中会有8个未使用的字节。

如果您经常重复使用这些比较器,您可能会考虑保留它们。但是,您还应该考虑到,与长生命周期对象相比,短生命周期对象对内存管理造成的压力要小得多,因此您必须大量重用比较器,让它们保持存活是值得的。

关于c# - 无数据类型的开销是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6500127/

相关文章:

c# - Thread.CurrentPrincipal.Identity 与 HttpContext.User.Identity

C++ 将一个对象的值复制到另一个对象

c# - C++/CX:将 std::string 转换为 Platform::String^

c# - SSL WCF "Could not establish trust relationship for the SSL/TLS secure channel with authority ' 本地主机'

.net - 编译 C 以使用 CLR

c# - 如何初始化表单以显示在与默认位置不同的位置,而不会出现移动?

c# - 不可变集合?

c# - CodeDom 如何创建具有 void 返回类型的方法?

c++ - 设计一个 Vector3D 类

python - pyqt GUI编程中如何组织类