泛型内存管理

2023-11-25

我对如何管理强类型泛型的内存有疑问

List<int> ints1 = new List<int>();
ints1.Add(1); ints1.Add(2); ints1.Add(3);

int[] ints2 = new int[10]();
ints2.Add(6); ints2.Add(7); ints2.Add(8);

问题 1:我认为 ints1 是用新关键字初始化的(new List<int>()) 它成为引用类型。值 1,2,3 存储在内存中的什么位置(它们存储在堆栈中还是堆中)?

问题2:我知道一件事List<int> and int[], List<int>可以在运行时将其大小缩放到任意大小,这受到限制int[]在编译时。因此,如果值 1,2,3 并存储在堆栈中,如果将新项目添加到List<int>比如说4,它不会连续到右边的前3个,那么ints1如何知道4的内存位置呢?


我认为 ints1 是用新关键字初始化的new List<int>()它成为引用类型

这个假设是不正确的。您也可以在值类型上使用“new”关键字!

int x = new int();

使用“new”并不会使任何东西成为引用类型。您可以将“new”与引用类型或值类型一起使用。 “新”所指的是将分配存储空间并调用构造函数.

在值类型上使用“new”的情况下,分配的存储是临时存储。对该临时存储的引用将传递给构造函数,然后将现在初始化的结果复制到其最终目的地(如果有)。 (“new”通常与赋值一起使用,但不一定如此。)

在引用类型的情况下,存储被分配两次:长期存储被分配给instance和短期存储分配给对实例长期存储的引用。该引用被传递给构造函数,该构造函数初始化长期存储。然后,将该引用从短期存储复制到其最终目的地(如果有)。

是什么使得List<int>引用类型是List<T>被声明为一个类。

值 1,2,3 存储在内存中的什么位置(它们存储在堆栈中还是堆中)?

我们努力打造一个内存管理器,让您不必关心内容存储在哪里。值存储在短期内存池(实现为堆栈或寄存器)或长期内存池(实现为垃圾收集堆)中。存储空间的分配取决于已知寿命的值。如果已知该值是短期的,则其存储空间将分配在短期池上。如果值为not已知其寿命较短,则必须将其分配到长期池中。

列表中的1、2、3可以永远存在;我们不知道该列表是否会比当前激活帧更长久。因此,存储 1、2、3 的内存被分配在长期池上。

不要相信“值类型总是在堆栈上分配”的谎言。显然这是不可能的,因为包含数字的类或数组无法在当前堆栈帧中生存!值类型在对其已知生命周期有意义的池上进行分配。

List<int>可以在运行时将其大小缩放到任意大小,这与int[]

正确的。看看如何做是有教育意义的List<T>这样做。它只是分配一个比它需要的更大的 T 数组。如果它发现猜测太小,它会分配一个更大的新数组,并将旧数组内容复制到新数组中。 AList<T>只是一堆数组副本的方便包装!

如果值 1,2,3 存储在堆栈中,并且将新项目 4 添加到列表中,那么它将不会连续到前三个。

正确的。这就是为什么值 1、2、3 的存储空间没有在堆栈上分配的原因之一。存储实际上是分配在堆上的数组。

那么列表如何知道第 4 项的内存位置呢?

该列表分配一个数组,即too big。当您添加新项目时,它会将其粘贴到太大数组中未使用的空间中。当数组空间不足时,它会分配一个新数组。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

泛型内存管理 的相关文章

  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 无法获取提供程序 com.google.android.gms.ads.MobileAdsInitProvider:java.lang.IllegalStateException

    我将 Android Studio 3 2 1 及其 sdk 更新到最新版本 之后 需要通过添加以下标签来手动更新清单
  • Django 访问表单集数据

    我无法访问通过表单集提交的数据 这是我的代码 模板
  • C# - 关闭 Sql 对象最佳实践

    如果您有一个带有 Sqlaccess 的 C 函数 是否必须关闭所有对象 句柄 或者退出该函数后所有内容都会自动清除 例如 void DoSqlStuff SqlConnection sqlConn new SqlConnection Sq
  • 如何解释铬火焰图中的间隙

    我试图更好地理解如何解释铬火焰图 在下面的图表中 changeHandler显示为四个不同的块 但我知道事实上它只被调用一次 我在这里看到了一个类似的问题 声称这可能是一个错误 但那是四年前的事了 Chrome devtools 配置文件火
  • 获取双 SIM 卡手机中的两个 SIM 卡运营商名称

    我想知道当手机是双卡时两个 SIM 卡的运营商名称 在单 SIM 卡中 我以编程方式获得运营商名称 但对于双 SIM 卡 我不能 尽管经过如此多的搜索和尝试 如果我在双 SIM 卡手机中运行我的应用程序 那么我可以在我的应用程序中获取两个
  • 如何使用brew链接到新的gcc版本?

    我刚刚通过运行获得了新的 gcc 版本brew update and brew upgrade 布鲁尔抱怨说brew link没有成功完成 brew upgrade gt Upgrading 1 outdated package with
  • 用户定义的不带下划线的文字

    根据参考参数可以使用定义文字 CSomeClass operator s const char literal size t size 现在读完该段落后我认为应该也可以定义 CSomeClass operator r const char
  • Android USB设备权限和意图过滤器

    我有一个 Android 应用程序 它将与 USB 设备交互 在Android 开发者官方文档获取与设备通信的权限它说 Note 如果您的应用程序使用 Intent 过滤器来发现连接的 USB 设备 那么当用户允许您的应用程序处理该 Int
  • lock 语句的开销有多大?

    我一直在尝试多线程和并行处理 我需要一个计数器来对处理速度进行一些基本计数和统计分析 为了避免并发使用类时出现问题 我在类中的私有变量上使用了锁定语句 private object mutex new object public void
  • MySQL 5.7:将简单的 JSON ARRAY 转换为行

    我有一个带有 JSON ARRAY 列的简单表 如下所示 id content 1 3 4 2 5 6 我想列出特定 id 的所有内容引用 SELECT JSON EXTRACT content as res FROM table WHER
  • 为 unordered_map 定义自定义哈希函数和相等函数

    我试图定义一种 unordered map 类型 它具有自定义哈希函数和相等比较函数 这些函数的函数原型如下 set
  • 如何构建一个比较器,以与 PostgreSQL 相同的方式对字符串进行排序?

    我正在编写一个通过复杂的集成测试order by到 PostgreSQL 然后检查数据是否以正确的顺序返回 我正在用 Java 编写这个集成测试及其String compareTo方法的排序方式似乎与 PostgreSQL 不同 我在 Po
  • 创建自定义 OnClickListener

    我有一个按钮数组列表 我的 OCL 需要知道我按下了哪个索引 计划是这样的 MyOnClickListener onClickListener new MyOnClickListener Override public void onCli
  • 对指针的 const 引用未按预期运行

    为什么我运行此程序时会出现错误 我原以为 ptr ref 无法修改 ptr 指向的地址 但事情似乎没有按计划进行 int b 3 int ptr b says something about cannot convert int to ty
  • LinkedIn 关注公司按钮显示空白页面

    我复制了代码这个链接通过提供公司名称并单击Get Code按钮 它生成了下面给出的代码 我将此代码粘贴到 html 文件的标签中 然后在 Chrome Firefox 和 IE 中运行该 html 文件 但所有浏览器都给出空白页面作为输出
  • 如何获取谷歌地图位置名称?

    我正在建立一个网站 需要获取所有谷歌地图位置 从国家名称到最小的村庄 这是api中的任何地方吗 因为它无处可寻 您需要解析响应以获取该数据 例如 如果您想获取国家 地区 结果是通过调用反向地理编码获得的结果对象 https develope
  • Xcode 9.1(和 9.2) - 引用的精灵不执行场景编辑器中添加的操作

    我在使用 SpriteKit 场景编辑器时遇到了一些意外的行为 想知道其他人是否也遇到同样的问题 我在场景中创建了一个精灵 并添加了动作以使用场景编辑器移动它 当我单击编辑器上的动画按钮时 动作运行良好 我使用场景编辑器中的 SKRefer
  • Delphi:如何在外部应用程序上正确使用ShowWindow [重复]

    这个问题在这里已经有答案了 也可以看看 如何判断我的程序的另一个实例是否已经在运行 我在启动应用程序之前使用以下代码来检查是否有另一个实例 其中已经开始 var PreviousHandle THandle begin PreviousHa
  • 适用于 .NET Framework 3.5 的 WebApi HttpClient [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 Net Framework 3 5 有可用的 WebApi 包吗 我特别期待使用 WebApi 的 HttpClient 组件 有没有适用于 Net
  • 泛型内存管理

    我对如何管理强类型泛型的内存有疑问 List