- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所有 .NET 类都将同步块(synchronized block)和类型指针存储为实例的一部分。这些在 32 位进程中总共占用 8 个字节,在 64 位进程中占用 16 个字节。但是,空类型实例的对象大小分别为 12 字节和 24 字节。
我看到一些文章说这是一个对齐问题,但由于同步块(synchronized block)和类型句柄是指针大小的,我不明白为什么需要添加任何填充。
其他文章说垃圾收集器需要它,但是它有什么开销呢?它不能在那里存储任何东西,因为如果类型具有实例字段,则实际上会使用额外的空间。垃圾收集器是否会在对象完成后和释放之前的某个时间对该内存执行某些操作,因为它需要一个地方来放置某些东西(可能是一个指针)?
以下是我读过的一些关于空字体大小的文章:
Performance Considerations of Class Design and General Coding in .NET :
If you made an object with no fields and looked at it in the debugger, you would notice that its size is actually 12 bytes, not 8. For 64-bit processes, the object would be 24 bytes. This is because the minimum size is based on alignment. Thankfully, this "extra" 4 bytes of space will be used by a field.
There’s a "minimum" size of 12 bytes and 24 bytes respectively. In other words, you can’t have a type which is just the overhead. Note how the "Empty" class takes up the same size as creating instances of Object… there’s effectively some spare room, because the CLR doesn’t like operating on an object with no data.
Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects :
As discussed previously, the current GC implementation needs an object instance of at least 12 bytes. If a class does not have any instance fields defined, it will carry an overhead of 4 bytes. The rest of the 8 bytes will be taken up by the Object Header (which may contain a syncblk number) and TypeHandle.
最佳答案
啊,我明白是怎么回事了。
数组将它们的长度存储为其实例字段数据(在类型指针之后)的前 4 或 8 个字节(分别在 32 位和 64 位系统中)。为了获得内存使用的大小,CLR 从方法表中获取基本大小(由类型指针指向)并将长度乘以每项大小(它也从方法表中获取)。
换句话说,公式是:
memory size = base size + length * item size
CLR 的实现者不想为数组使用一个公式而为其他类型使用不同的公式,而是希望为两者使用一个公式,从而在获取内存大小时不需要任何条件逻辑。
但这怎么行呢?其他对象类型不在其实例字段数据的前 4 或 8 个字节中存储长度。
key是item size,保存在method表中。对于非数组类型,项目大小为 0。这意味着无论实例字段数据的前 4 或 8 字节中存储的值如何,长度 * 项目大小始终为 0,并且公式有效。
但即使实例字段数据的前 4 或 8 个字节的值无关紧要,它仍然需要分配以防止访问冲突。
感谢 Hans 指点我使用 SetFree 方法。当我看到 CLR 本质上是将任意对象转换为一维字节数组时,我意识到这是在假设一切都可以以这种方式转换,而对原因的调查让我得到了这个答案。
关于.net - .NET CLR 如何处理空类型的内存开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26952077/
我想知道,通过数据 channel 发送数据时 WebRTC 会产生多少开销。 我知道 Websockets 每帧有 2 - 14 字节的开销。 WebRTC 是否使用更多开销?我在网上找不到一些有用
我想知道与创建新类而不是该类的新对象相关的开销是小还是大。我正在使用 dojo,但我将提供纯 JS 的示例。我将在启动时创建 10 到 100 个对象,我认为这不会是一个严重的问题,但我想涵盖所有基础
我有一个如下所示的表设置。 Table comment_flags user_id comment_id 我允许用户标记评论,然后给他们取消标记的选项,因为他们可能犯了一个错误。 问题
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: In MySQL what does “Overhead” mean, what is bad about it,
我正在制作一个非常简单的游戏,只是为了好玩/练习,但无论它现在有多简单,我仍然想很好地编写它,以防我想回到它并只是为了学习 因此,在这种情况下,我的问题是: 对象分配涉及多少开销?解释器对此的优化程度
我有一些资源敏感的东西要写。我想知道与仅将这些变量一起传递(例如作为函数参数)相比,在结构中将变量组合在一起是否真的会导致内存开销。 如果是这样,那么在不产生开销的情况下创建对惰性值进行操作的东西的好
我一直在开发一个实时应用程序,并注意到一些 OOP 设计模式在 Python 中引入了难以置信的开销(使用 2.7.5 进行了测试)。 直截了当,当字典被另一个对象封装时,为什么简单的字典值访问器方法
我正在从 ifstream 中读取随机 ascii 文本文件。我需要能够将整个消息放入字符串类型以进行字符解析。我当前的解决方案有效,但我认为我通过使用等效于此的方式来谋杀更冗长文件的处理时间: st
纯粹从软件工程的角度来看,getActivity() 有多少开销? 我在整个应用程序中经常多次使用此方法,并考虑使用一个引用 getActivity() 的全局变量。 如果为 Activity 设置一
我一直在研究 Riccardo Terrell 的 Akka.NET 分形演示 (https://github.com/rikace/akkafractal) 以尝试理解它。 (这很棒,顺便说一句)
我正在尝试使用高分辨率计时器查找我的代码运行时间,我注意到计时器的结果不一致,我想知道为什么会这样。 我找到了这篇文章 How do you test running time of VBA code
我正在学习WPF。我现在开始装订了。使用 INotifyPropertyChanged 时绑定(bind)是否依赖反射?是这样,价格是多少?我正在考虑使用 WPF 来显示通过 UDP 流式传输的数据,
我有某种模板化基类 template class Base { }; 并希望将其派生实例存储在列表中。为此,我使用 using derived_handle = std::unique_ptr v
使用GHC.TypeLits中的Sing有任何开销吗? ?以程序为例: {-# LANGUAGE DataKinds #-} module Test (test) where import GHC.T
我有某种模板化基类 template class Base { }; 并希望将其派生实例存储在列表中。为此,我使用 using derived_handle = std::unique_ptr v
我有一个 ORM sqlalchemy 模型,我需要构建一个查询(使用 ORM 类更容易构建),但这需要大量时间。当我直接像 SQL 一样向数据库执行相同的查询时,速度相当快。 使用 SQLAlche
我在 PHP 平台上有一家商店(开发不善),那里有很多不好的查询(没有索引的长查询、rand() 排序、动态计数,..) 我现在无法更改查询,但我必须调整服务器才能保持事件状态。 我尝试了我所知道的一
我有一个使用 JQuery mobile 构建的移动应用程序,响应时间对我来说非常重要,因为我希望为我的用户提供流畅的体验。 我刚刚将网站的安装移至本地服务器,以提高应用程序的性能,因为它连接到本地
关于数据库设计的问题。如果我有 28 个 bool 值并且能够将它们添加为每行 28 个 bool 值或一个整数,哪一个会更快?哪种方法将使磁盘上的表大小保持最低? 这是在假设我需要的可以通过查询中的
我有一个看起来像 Boost.Array 的简单类。有两个模板参数 T 和 N。Boost.Array 的一个缺点是,每个使用这种数组的方法都必须是带有参数 N 的模板(T 可以)。结果是整个程序往往
我是一名优秀的程序员,十分优秀!