C++的RAII在WebKit中的应用

先看下面这段WebKit中的代码:

{
    NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel);
    //Do something else...
}

看看NestingLevelIncrementer的实现,就知道与另一种写法看似是等价的:

{
    ++m_scriptNestingLevel;
    //Do something else...
    --m_scriptNestingLevel;   }

上面的实现是不是用加一个类的代价解决了一个简单的问题?其实是应用了C++里一个重要的概念RAII (*关键是后续执行有没有可能抛出exception),更为典型的是WebKit中大量MutexLocker的使用。

什么是RAII (来自Stackoverflow的回复):

C++ does not support 'finally' blocks. The reason is that C++ instead supports RAII: "Resource Acquisition Is Initialization". The idea is that an object's destructor is responsible for freeing resources. When the object has automatic
storage duration, the object's destructor will be called when the block in which it was created exits -- even when that block is exited in the presence of an exception.

(原文地址)

附篇资料可以快速了解:

  RAII惯用法:C++资源管理的利器

附个PPT资料: WebKit中的两个小设计

更多的C++ idioms: More C++ idioms

时间: 2024-09-19 15:46:48

C++的RAII在WebKit中的应用的相关文章

Webkit中HTML5 Video的实现分析 (四) - 视频加载及播放的时序图

MediaPlayer同MediaPlayerPrivateInterface,再同播放控件的交互过程应当要简单.清晰.MediaPlayer通过自身的状态(Network States 和 Ready States)来控制操作的步骤.MediaPlayerPrivateInterface具体到不同的平台和视频格式,使用的具体的播放控件会不同. 这里仅贴一张时序图,其中没有特别区分HTMLVideoElement,使用的播放控件是Webkit默认的QuickTime组件.在调试时,最好要将UA调

Webkit中HTML5 Video的实现分析 (一) - 基本结构及HTMLMediaElement & MediaPlayer

以下为针对Webkit中HTML5 Video实现原理的分析和学习总结.至于其中的UML图档,可以到下面的github链接中下载. 首先预览一下Webkit中和Video相关的主要的类的层次结构: 其中主要的类为HTMLMediaElement, MediaPlayer以及RenderVideo(左下角). HTMLMediaElement代表了DOM结点,其继承关系可以追溯到Node,也就是DOM的结点.网页中Video/Audio元件的解析就是由它的创建开始.JavaScript的视频操作A

WebKit 中异步加载脚本(Running scripts in WebKit)- 大大提升界面呈现速度

WebKit 中异步加载脚本(Running scripts in WebKit)- 大大提升界面呈现速度 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. Running scripts in

Webkit中HTML5 Video的实现分析(六) - Safari视频机制分析

Safari中的视频相关操作封装在QuickTime Plugin里面,存放于/Library/Internet Plugin目录下.   下图是相关类的class diagram: 其中的QuickTime Plugin是通过已淘汰的Apple之前定义的Webkit Plugin协议来实现的,而不是现在支持的Netscape API的机制. 可以参考以下文档:        Introduction to WebKit Plugin Programming Topic           We

Webkit中HTML5 Video的实现分析 (三) - MediaPlayer & MediaPlayerPrivate的生命周期

明确主要类的生命周期有助于更好理解Webkit中视频的工作流程.下图展示了类间的引用关系. 如HTMLVideoElement与一个MediaPlayer对应,MediaPlayer与MediaPlayerPrivate一一对应,它们都是一个组合关系,当所有者自身被析构时,会自动释放引用的实例.这个过程都是使用OwnPtr智能指针来实现的.   OwnPtr赋值操作的代码:        OwnPtr& operator=(std::nullptr_t) { clear(); return *t

Webkit中HTML5 Video的实现分析(五) - WebKit中视频事件的传递

HTML的每个元素都可以让JavaScript在某些事件发生时,进行处理.就比如onclick="clickButton()"之类的属性设定. 像下面这篇博客所讲的一样,在WebKit中每个元素都有其对应的JS绑定的实现: [WebKit]为JavaScript Binding添加新DOM对象的三种方式及实作 对于视频元素,可以对应看看JSHTMLMediaElement.cpp和JSHTMLVideoElement.cpp中的实现. 这里只说一下事件的处理机制.就是在WebKit中有

webkit中页面不能跳转-c#程序webkit页面不能跳转

问题描述 c#程序webkit页面不能跳转 winform中添加webkitbrowser,passport.baidu.com页面登录不能跳转,显示登录超时如何解决??急急急 解决方案 目前采用chromewebbrowser支持,感谢各位大牛的技术支持 解决方案二: fiddler调试下,点了登录发送请求到服务器了没有 解决方案三: 是不是webkit版本太旧有些新标准不支持了呢?其实我觉得用chromium比用webkit更好

Webkit中HTML5 Video的实现分析 (二) - MediaPlayerFactory & RenderVideo的绘制操作

MediaPlayerFactory MediaPlayerFactory像是一个解码库一样,初始化时,各个可用的播放器(MediaPlayerPrivate)向它注册.当需要解码时,由它给出一个合适的播放器(呼叫MediaPlayerPrivate::constructor,即MediaPlayerPrivate::create)创建一个实例[由MediaPlayer:: loadWithNextMediaEngine执行]).所以MediaPlayer与MediaPlayerPrivate应

Webkit优化网站在IE10兼容最优方案

文章简介:本指南涵盖了你为Webkit优化的网站在IE10和其他兼容标准的浏览器上也能运行得很好的最常用的适配方案.如果你有其他技巧是本文没有涵盖的,请你分享在下面的评论栏里. IE10对HTML5的广泛支持确保了你的网站在Windows Phone 8中比以往任何时候都能运行的好.之前,为了支持iOS或Android你可能会把Webkit作为专门优化的目标.现在可以让你为Webkit优化的网站也能轻松适配IE10.这意味着你将维护更少的代码,并且,可以给你的客户一个更好的体验.更让人欣喜的是,