写在前面

看《CLR via C#》第四章时,看到了类型对象指针和同步块索引这两个概念,不知如何解释,查看过相关资料之后,在此记录。

类型对象指针

《CLR via C#》中的原话:

任何时候在堆上创建对象,CLR都自动初始化内部的“类型对象指针”成员来引用 与对象对应的类型对象。

在JIT编译器将IL代码转换成本机CPU指令的时候,利用程序集的元数据,CLR提取与代码中类型有关的信息,创建一些数据结构来表示类型本身。

CLR开始在一个进程中运行时,利用MSCorLib.dll中定义的System.Type类型创建一个特殊的类型对象,代码中的类型对象都是该类型的“实例”,因此,它们的类型对象指针成员会初始化成对的System.Type类型对象的引用

System.Object的GetType方法返回存储在指定对象的“类型对象指针”成员中的地址。也就是说,GetType方法返回指向对象的类型对象的指针。这样就可以判断系统中任何对象(包括类型对象本身)的真实类型。

同步块索引

先看如下图:

首先,CLR创建类Manager,在内存中分配 类Manager 所占用的空间,当创建Manager的实例M1的时候,M1的类型对象指针就指向Manager。

当用lock来锁定M1的时候,M1的同步块索引就指向一个同步块(这里说明一下同步块,CLR负责创建同步块,可以把它理解为一个数组,数组中的每一个元素就是一个同步块)。

M1的同步块索引初始为一个负数,表示M1没有同步,当用lock的时候,CLR负责在同步块数组中寻找空闲的同步块,并把M1的同步块索引被设置为一个整数S,S为找到的同步块在同步块数组中的索引。

当lock结束之后,M1的同步块索引又被重新设置为负数。

关于lock的一些有关概念,可以看我的上一篇博客。

写在最后

总结:

1、好好钻研《CLR via C#》这本书!很多有意思的知识,可以深入的理解C#的运行机制。

2、.NET真是太棒了。

[C#学习笔记]类型对象指针和同步块索引的更多相关文章

  1. C# CLR via 对象内存中堆的存储【类型对象指针、同步块索引】

    最近在看书,看到了对象在内存中的存储方式. 讲到了对象存储在内存堆中,分配的空间除了类型对象的成员所需的内存量,还有额外的成员(类型对象指针. 同步块索引 ),看到这个我就有点不懂了,不知道类型对象指 ...

  2. 揭示同步块索引(上):从lock开始

    转自:http://www.cnblogs.com/yuyijq/archive/2009/03/13/1410071.html 大家都知道引用类型对象除实例字段的开销外,还有两个字段的开销:类型指针 ...

  3. Python学习笔记_Python对象

    Python学习笔记_Python对象 Python对象 标准类型 其它内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比較 对象身份比較 布尔类型 ...

  4. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  5. 揭示同步块索引(中):如何获得对象的HashCode

    转自:http://www.cnblogs.com/yuyijq/archive/2009/08/13/1545617.html 题外话:为了尝鲜,也兴冲冲的安装了Win7,不过兴奋之余却郁闷不已,由 ...

  6. javascript深入浅出——学习笔记(包装对象和类型检测)

    3包装对象:https://www.imooc.com/video/5676 当我们尝试把基本类型已对象的方式访问时,javascript会把该基本类型转换为对应的包装类型对象(临时对象),相当于ne ...

  7. 【cocos2d-x 3.x 学习笔记】对象内存管理

    内存管理 内存管理一直是一个不易处理的问题.开发人员必须考虑分配回收的方式和时机,针对堆和栈做不同的优化处理,等等.内存管理的核心是动态分配的对象必须保证在使用完成后有效地释放内存,即管理对象的生命周 ...

  8. Python核心编程--学习笔记--4--Python对象

    现在开始学习Python语言的核心部分.首先了解什么是Python对象,然后讨论最常用的内建类型,接下来讨论标准类型运算符和内建函数,之后给出对标准类型的不同分类方式,最后提一提Python目前还不支 ...

  9. JavaScript:学习笔记(8)——对象扩展运算符

    JavaScript:学习笔记(8)——扩展运算符 对象的扩展运算符 扩展运算符是三个点(...).用于取出参数对象的所有可遍历属性,然后拷贝到当前对象之中. 如上图所示,新建了一个对象a,然后通过扩 ...

随机推荐

  1. Passing the Message

    Passing the Message http://acm.hdu.edu.cn/showproblem.php?pid=3410 Time Limit: 2000/1000 MS (Java/Ot ...

  2. 安装配置Windows Live Writer做为博客客户端

    前言: 国内好些空间.博客是支持Windows Live Writer客户端的,也就是说使用Windows Live Writer不用登陆博客网站,就可以向不同的博客网站发布博客了. Windows ...

  3. mongo通信协议

    先是一个包头: struct MsgHeader { int32 messageLength; // total message size, including this int32 requestI ...

  4. uploadify在chrome下初始化失败,在Firefox下却可以原因探析

    如果没有报错,在其他浏览器下没问题,那就只有一种可能:浏览器flash加载失败,解决办法是,更改浏览器对站点flash的设置.参考下图:

  5. Nginx 分析access日志文件

    Nginx Access Log日志统计分析常用命令 IP相关统计 统计IP访问量 awk '{print $1}' access.log | sort -n | uniq | wc -l 查看某一时 ...

  6. oracle执行多个pl/sql块

    DECLARE    V_SQL_DROP_TABLE   VARCHAR2(50) := 'DROP TABLE MY_TEST2';    V_SQL_CREATE_TABLE VARCHAR2( ...

  7. easyui-从数据库读取创建无极菜单

    easyui-tree基础必须知道这个如下: 树控件使用<ul>元素定义.标签能够定义分支和子节点.节点都定义在<ul>列表内的<li>元素中.以下显示的元素将被用 ...

  8. 经典递归问题:0,1背包问题 kmp 用遗传算法来解背包问题,hash表,位图法搜索,最长公共子序列

    0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多 ...

  9. linux下集成开发环境之ECLIPSE--在线调试、编译程序

    裸机开发流程 1.编写裸机程序:2.调试裸机程序:3.生成2进制映象(编译.链接.格式转换):4.烧写/运行2进制映象. 注意:我们自己开发的程序等等需要下载到开发板的Nandflash(类似于硬盘功 ...

  10. Perl的调试模式熟悉和应用

    perl -d file.pl perl -c file.pl DB<1> hList/search source lines:               Control script ...