我想知道这个类(它的对象)的内存布局是什么样的:
class MyClass
{
string myString;
int myInt;
public MyClass(string str, int i)
{
myString = str;
myInt = i;
}
}
MyClass obj = new MyClass("hello", 42);
有人能想象一下吗?
Update:
根据 Olivier Rogier 的回答以及 ckuri 和 Jon Skeet 的评论,我尝试制作一个高级图表,该图表深受开发博客文章 https://devblogs.microsoft.com/premier-developer/managed-object-internals-part-1-layout/库里提到过。
所以据我的理解:
obj
(8 字节引用)指向包含元数据的对象(实际上不是其开头,但为了简单起见,让我们忽略它)。
在这个地方myInt
被存储并且myString
参考值(即对真实字符串值的引用)
我不想透露最后的细节,但我仍然好奇的是:
If obj.myString
应访问,是否需要两次“查找”,例如首先抬头obj
,然后跟随它并向上查找myString
或者是否有类似全局地址表的东西,其中的地址obj.myString
是直接存储的吗?
参考值在哪里obj
存储?它是的一部分吗program
对象块就像myString
是的一部分obj
对象块? (假设obj
在实例内部创建program
)
在此位置存储 myInt 和 myString 引用值(这是对真实字符串值的引用)
让我们确保您不会在这里走上错误的道路。
首先,我不清楚为什么与源代码相比,您对图中的整数和字符串重新排序。字符串和整数的打包方式、顺序以及是否有填充字节是由实现定义的。如果您关心这些细节,请提出更明确的问题。
其次,不清楚“真正的字符串值”是什么意思。字符串是引用类型。字符串的真实值是引用。的价值观contents字符串的位置位于引用的位置。
如果要访问 obj.myString,是否需要两次“查找”,例如首先查找 obj,然后跟踪它并查找 myString
我认为“查找”你的意思是解引用.
例如,如果我们有:
var obj = whatever;
char c = obj.myString[1];
那么是的,我们有两个取消引用。这.
取消引用obj
to get myString
,这是一个参考。这[1]
取消引用myString
得到char
.
obj的引用值存储在哪里?
obj
是一个变量。变量是一个存储位置。该存储位置可以位于多个位置:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)