[译].Net中的内存-什么分配在了哪里

原文链接:https://jonskeet.uk/csharp/memory.html

  人们在理解值类型和引用类型之间的差异时因为“值类型在栈上分配,引用类型在堆上分配”这句话造成了很多混乱。这完全是不对的,本文试图澄清这个问题。

变量中有什么?

  理解.NET中内存工作方式的关键是理解变量是什么,以及它的值是什么。在最基本的层面上,变量是变量名和内存之间的关联。变量的值是与之关联的内存中的内容。该值占用内存空间的大小和值的解释取决于变量的类型 - 这正是值类型和引用类型之间的差异所在。

  引用类型变量的值始终是引用或null。如果是引用,则它必须是与其变量类型兼容的对象的引用。例如,以Stream s声明的变量s的值是null或Stream类型(或其兼容类型)实例的引用。引用类型变量所占内存空间的大小是引用的大小,引用的大小在32位模式下固定为4个字节,在64位模式下固定为8个字节。

  值类型变量的值始终是其对象本身的值。例如,对于给定的结构:

   以PairOfInts pair声明的变量pair的值是整数对本身,而不是对一对整数的引用。其所占内存空间则是两个整数的大小,即8个字节。请注意,值类型变量永远不能赋值为null - 因为这没有任何意义,值类型变量不是一个引用。

那么东西存放在哪里?  

  变量的分配位置取决于声明它的上下文:

  • 局部变量在栈上分配。这包括引用类型变量 - 变量本身位于栈上,其引用的值分配在堆上。方法参数也计为局部变量,但如果使用ref、out、in修饰符修饰它们,则它们不再是原始类型,而是转换为托管指针类型(Type &),此时传递的是原变量的指针,不再是变量本身。

  • 引用类型的对象始终在堆上分配。

  • 值类型的对象始终内联分配。即在方法中声明的值类型变量在栈上分配,而作为类的实例字段的值类型变量将在堆上分配。

  • 静态变量在堆上分配,包括引用类型和值类型中声明的静态变量。无论创建多少个实例,静态变量都共享一个内存空间。

  上述规则有几个例外:在使用匿名方法时的外部变量和迭代器中的局部变量会由编译器优化为其它类型的实例字段,这些变量会转移到堆中分配。

举个例子

  上述文字描述可能听起来有点复杂,但一个完整的例子可以让事情更清楚一些:

   让我们看一下标记“XXX”位置时内存中的内容。

  • 在栈上分配一个PairOfInts类型的对象,对应变量z。

  • 在堆上分配一个Test类型的对象,在栈上分配一个引用指向该对象,对应变量t1。以32位模式举例,该对象在堆中占用20个字节:8个字节的头信息(所有堆对象都有),8个字节用于存储PairOfInts实例,4个字节用于存储字符串引用。

  • 在堆上分配一个Test类型的对象,在栈上分配一个引用指向该对象,对应变量t2。该对象与上面的对象非常相似。

  • 在栈上分配一个引用,对应变量t3。这个引用是null - 它没有引用任何对象。

  • 在栈上分配一个引用,对应变量t4,并赋值t1引用的对象,此时t1和t4引用堆内存中的同一个对象。

  • 最后,在堆内存中有一个静态变量PairOfInts.counter。

原文:https://www.cnblogs.com/minotauros/p/11254159.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上车时机已到--.NETCore是适应时代发展的雄鹰利剑

要起飞了.NET Core 3.0-prevew7:https://dotnet.microsoft.com/download/dotnet-core/3.0随着 .NET Core 3.0-prevew7 的发布,开源社区的一支重要力量重要即将起飞;官方指出,该预览版为可能为最终版本,在很长一段时间内…

HDU - 7028 Decomposition 无向完全图构造欧拉回路

传送门 文章目录题意:思路:题意: 给你一张无向完全图,让你构造kkk个长度分别为lil_ili​的路径,这些路径不相交,且∑lin∗(n−1)2\sum l_i\frac{n*(n-1)}{2}∑li​2n∗(n−1)​。 n≤1000,nmod21n\le1000,…

「Azure」数据分析师有理由爱Azure之二-立即申请帐号开始学习之旅

目前关于Azure的学习资料不多,除了官方的文档和Microsoft Learn频道外,几乎没有什么中文性资料可学习,就算有,也是以IT的思维方式来展开介绍,对没有IT背景的数据分析师来说,非常难于适应。本篇给大家带来一…

矩阵快速幂的最简单用法

矩阵快速幂 链接:https://ac.nowcoder.com/acm/contest/1168/K 来源:牛客网 题目描述 这个勇者明明超强却过分慎重,勇者龙宫院圣哉与n名冒险者一起去讨伐神秘魔物,龙宫院圣哉十分谨慎,他只会在最后一刻出手&#xff…

DevOps案例研究|史上最能“拜客户教”的公司,是如何做到持续交付的?(第1趴)...

内容来源:DevOps案例深度研究 –Amazon持续交付之道战队(本文只展示部分PPT及研究成果,更多细节请关注案例分享会,及本公众号。)本案例内容贡献者:单冰 (Topic Leader)、 赵栋、梁兴龙、李杰、毛艳清、牛恒…

P2261 [CQOI2007]余数求和 整除分块

传送门 文章目录题意:思路:题意: n,k≤1e9n,k\le1e9n,k≤1e9 思路: 考虑转换式子,∑i1nkmodi∑i1n(k−⌊ki⌋∗i)n∗k−∑i1n⌊ki⌋∗i\sum_{i1}^{n}k\bmod i\sum_{i1}^n(k-\left \lfloor \frac{k}{i} \right \rfloo…

背包问题——第一篇

一,01背包 最简单也是最经典的背包问题。 首先我们知道背包问题是一种d问题,最重要的就是要去找到他的状态转移方程。而在01背包中转移方程就比较简单了,这里用一个二维数组进行标表示。 ans[i][j]max(ans[i-1][j],ans[i-1][j-v[i]w[i]); 在…

小白开学Asp.Net Core 《十》

小白开学Asp.Net Core 《十》 — — Session、Cookie、Cache(老生常谈)一、背景在常谈Session和Cookie之前我们先来简单的了解下Http(可以说这是必须的,默认大家都了解)总结一句话:HTTP是一种无状态的协议&…

P3935 Calculating 整除分块

传送门 文章目录题意:思路:题意: 思路: 我们设s(x)∑i1nf(x)s(x)\sum_{i1}^nf(x)s(x)∑i1n​f(x),那么答案就是s(r)−s(l−1)s(r)-s(l-1)s(r)−s(l−1)。 容易发现,我们要求的f(x)f(x)f(x)实际上就是xxx的…

Sticks-hdu-1455深度搜索dfs

Sticks 题目传送门。 题目大意是,给你一个数字n代表总共的棍子数量,要做的就是,把这几根棍子拼成长度相同的棍子,并且让所拼成的棍子的长度尽可能地小,也就是拼成的棍子的数量尽可能的多。 在这里很简单的想到要给棍…

gRPC in ASP.NET Core 3.0 -- Protocol Buffer(1)

开发环境:IDE: VSCodeVSCode的扩展插件:vscode-proto3和Clang-Format这两个扩展Windows还需要安装Clang,Windows 64位系统的地址如下:Clang for Windows (64-bit)(http://llvm.org/releases/3.7.0/LLVM-3.7.0-win64.exe)&#xff…

[蓝桥杯2016初赛]方格填数

正如题目,我们要保证相邻的数不相连就行了,一共要填十个数。 下面是我的思路,供大家参考一下, 我把上面的各子放进了这个5*6的矩形,其中标记1–10的分别是要填数的各格子,一开始我先初始化这个二维数组为全…

2021牛客暑期多校训练营7 xay loves monotonicity 线段树区间合并

传送门 文章目录题意:思路:题意: 题面挺绕口的,还是看原题比较好。 大概的意思就是让你从给定的区间中选择一个以左端点为起点的一个上升子序列,让后将这些下标存下来,在bbb中将这些位置拿出来后&#xff…

容器化单页面应用中Nginx反向代理与Kubernetes部署

在《容器化单页面应用中RESTful API的访问》一文中,我介绍了一个在容器化环境中单页面应用访问后端服务的完整案例。这里我将继续使用这个案例,介绍一下容器化单页面应用部署的另一个场景:将Nginx的职责独立出来。注:这里单页面应…

[蓝桥杯2019初赛]迷宫-DFS、BFS两种方法

迷宫问题的最短路&#xff0c;加最小字典序 迷宫文件maze.txt传送门 作者写的2019年B组蓝桥杯解集 . . . DFS的版本 #include<iostream> #include<cstring> using namespace std; const int ax[4]{0,0,1,-1}; const int ay[4]{1,-1,0,0}; const char dir[5]{R,L…

2021牛客暑期多校训练营7 xay loves trees dfs序 + 主席树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两棵树&#xff0c;让你在第一棵树选一条最长的深度递增的链&#xff0c;链上每一个点在第二棵树上都不互为祖先。 n≤3e5n\le3e5n≤3e5 思路&#xff1a; 之前做过差不多的题传送门。 之前哪个题是不…

xxl-job dotnet core executor执行器开源

DotXxlJob[(github)https://github.com/xuanye/DotXxlJob][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现&#xff0c;支持XXL-JOB 2.01 XXL-JOB概述[XXL-JOB][1]是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量…

2019年第十届蓝桥杯 C / C ++省赛 B 组真题题解

A: 组队 输入数据 编号 号位1 2 3 4 51 97 90 0 0 0 2 92 85 96 0 0 3 0 0 0 0 93 4 0 0 0 80 86 5 89 83 97 0 0 6 82 86 0 0 0 7 0 0 0 87 90 8 0 97 96 0 0 9 0 0 89 0 0 10 95 99 0 0 0 11 0 0 96 97 0 12 0 0 0 93 98 13 94 91 0 0 0 14 0 83 87 0 0 15 …

HDU - 7054 Yiwen with Formula 分治拆位FFT + dp + 费马小定理降幂

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 求aaa的所有子序列的和的乘积。 思路&#xff1a; 看到suma≤1e5sum_a\le1e5suma​≤1e5&#xff0c;这应该会给我们提示&#xff0c;但是我没看到。 我们可以记cntxcnt_xcntx​表示和为xxx的子序列有cnt…

使用Redis创建分布式锁

点击上方蓝色字关注我们~在本文中&#xff0c;我们将讨论如何在.NET Core中使用Redis创建分布式锁。当我们构建分布式系统时&#xff0c;我们将面临多个进程一起处理共享资源&#xff0c;由于其中只有一个可以一次使用共享资源&#xff0c;因此会导致一些意外问题&#xff01;我…