结构体总是分配堆栈还是有时分配堆?

2023-11-24

我的印象是,在 C# 中,结构元素是在堆栈上分配的,因此从创建它们的方法返回时会消失。但是如果我将结构值放入列表中并返回它会发生什么?元素得以幸存。结构体实例有时会分配在堆上吗?

internal struct Stru
{
  public int i;
}

internal class StruTry
{
  public List<Stru> Get(int max)
  {
    var l = new List<Stru>();
    for (int i = 0; i < max; i++)
      l.Add(new Stru {i=i});

    return l;
  }
}

代码打印 0, 1, 2

[Test]
public void T()
{
  var ll = new StruTry().Get(3);
  foreach (var stru in ll)
    Console.WriteLine("* "+ stru.i);
}

首先,阅读 Eric Lippert 的这篇文章堆栈是一个实现细节。跟随它关于值类型的真相。 至于你的具体问题

结构体实例有时会分配在堆上吗?

是的,它们有时分配在堆上。有很多关于何时可以在堆上分配它们的示例。如果它们被装箱,或者它们是类中的字段,或者它们是数组的元素,或者它们是已封闭的值类型变量的值,等等。

但是如果我将结构值放入列表中并返回它会发生什么?元素得以幸存。

您正在以正确的方式思考这一点,这是可以分配值类型的要点之一。有关更多详细信息,请参阅我在关于值类型的真相中提到的第二篇文章。但请记住堆栈是一个实现细节。关键的一点是你真的不需要关心这些东西。您应该关注值类型和引用类型之间的语义差异。

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

结构体总是分配堆栈还是有时分配堆? 的相关文章

  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • MySQL 从一张表更新到另一张表时条件不起作用?

    我尝试过一种似乎对其他人有效的解决方案 从表 b 更新表 a 其中 条件 我似乎无法让它工作 MySql 给了我一个语法错误 我有两个表 我需要将一个表中的一列更新为另一列的值 其中两个表中的 id 都匹配 UPDATE video dat
  • 找不到控制器方法 - laravel 4

    我在尝试运行任何控制器时收到此消息 Symfony Component HttpKernel Exception NotFoundHttpException 未找到控制器方法 我的路线文件中有此代码 Route controller Hom
  • 重新分配而不释放旧内存

    我想使用 realloc 来增加内存大小 同时保持指针不变 因为调用者使用它 realloc 并不总是这样做 有时它会返回一个不同的指针并释放旧的指针 我想 尝试 重新分配内存 如果不可能 则使用原始指针回退到不同的方法 但重新分配已经破坏
  • CodeIgniter + jQuery(ajax) + HTML5 Pushstate:如何使用真实的 URL 进行干净的导航?

    我目前正在尝试建立一个新网站 没什么特别的 漂亮又小 但我一开始就陷入困境 我的问题是干净的 URL 和页面导航 我想以 正确的方式 去做 我想要什么 我使用 CodeIgniter 来获取干净的 URL 例如 www example co
  • 在ios中重绘视图

    是否可以重绘整个视图 我需要它来完成我的语言设置 问题是语言只有在再次绘制视图后才会改变 就像您退出设置然后再次进入一样 语言也会更改 但是当你保存所有内容时 语言保持不变 那么 在发现语言更改后 我应该如何重新绘制我的视图 或者最好是整个
  • 滑动屏幕的某些部分

    I am trying to design one screen which contain some swipe part I have one screen with mapview listview and some text My
  • 使用 axios 获取本地 JSON 数据时遇到问题

    我正在尝试使用 axios 从本地 json 文件获取数据 在控制台下我什至无法得到回应 所以我想我应该在这里询问一下 js 文件 var loadData function loadData axios url filepath json
  • ASP.Net MVC 模型绑定 - 如何更改日期格式?

    我有这个应用程序 默认日期格式必须是dd MM yyyy 语言为巴西葡萄牙语 我已经将文化和 UI 文化设置为pt BR现在myDate ToShortDateString 返回我想要的日期 我可以毫无困难地展示它们 问题是 当用户在输入字
  • Yii2:如何在非 Restful API 上允许 CORS

    我正在 Yii2 Framework 上使用预构建的 API 不是 Restfull 它使用 JSON 数据进行响应 并根据用户类型和凭证令牌接受请求 现在我必须制作一个位于不同位置 域 的应用程序 这会导致 CORS 冲突 我的应用程序是
  • 如何在 matlab 中格式化复数以进行文本输出

    我有一个复数 我想使用 fprintf 命令将其输出为文本 我没有看到复数的格式规范 是否有捷径可寻 使用定点格式规范仅输出实部 根据文档fprintf and sprintf 数字转换仅打印复数的实部 所以对于一个复杂的值z你可以用这个
  • Django 错误消息“在定义中添加 related_name 参数”

    D zjm code basic project gt python manage py syncdb Error One or more models did not validate topics topic Accessor for
  • 如何处理 MS Word 添加的“特殊”字符?

    我想知道你如何清理 MS Word 中的特殊字符 例如 m 和 n 破折号以及弯引号 我经常发现自己从 Word 中复制客户端内容并粘贴到静态 HTML 页面中 但内容最终会出现奇怪的字符 因为特殊字符未转换为正确的 ACSII 代码 因此
  • 将字符串转换为 &strs 时,切片和显式重新借用之间有区别吗?

    下面两个例子等价吗 示例1 let x String new let y x 示例2 let x String new let y x 一种比另一种更有效率还是它们基本相同 如果是String and Vec 他们做同样的事情 在gener
  • Node.js/Async - 如何避免异步回调地狱?

    我是后端 Node Js 和 JavaScript Web 开发的新手 我发现回调中的回调可能会很痛苦 并且有一些模块可以避免这种情况 这些模块之一是异步的 https github com caolan async 我已阅读文档 但很难开
  • 如何在解决方案资源管理器上保留源文件夹层次结构?

    我在Linux上做了一个C 项目 我将源文件分组在许多目录中以自己组织 我使用 CMake 进行编译 每个子目录上都有一个 CMakeFiles txt srcs folderA Toto cpp Tata cpp folderB Foo
  • htaccess重写库

    我的根目录中有两个目录 dev and live 这些目录中的所有内容都有相对路径 例如 css style css or js home js 我希望能够使用 htaccess 更改根目录 以便相对路径变为 live css style
  • 将字符串数组转换为打字稿中的对象键

    我有下一个数组 const arrayData a b as const 该数组有下一个类型 ArrayType a b 我想获得与下一个类型一致的对象 type Type a boolean b boolean 预期对象 const re
  • 在Python中异步播放声音

    我有一个while loop让我的相机 带有 opencv 在物体移动时拍照 我也想调用一个函数来播放声音 但是当我调用并播放它时 它将在该执行时间内停止循环 我试过ThreadPoolExecutor但不知道如何将它与我的代码混合 因为我
  • 使用 gettext() 将 settings.LANGUAGES 与正确翻译的名称一起使用

    来自 Django 文档 如果您定义了自定义LANGUAGES设置 标记语言就可以了 作为翻译字符串 如 上面显示的默认值 但是 使用 假人 gettext 函数 不 中的一个django utils translation 你永远不应该导
  • 结构体总是分配堆栈还是有时分配堆?

    我的印象是 在 C 中 结构元素是在堆栈上分配的 因此从创建它们的方法返回时会消失 但是如果我将结构值放入列表中并返回它会发生什么 元素得以幸存 结构体实例有时会分配在堆上吗 internal struct Stru public int