从LLVM源码学C++(一)

今天开始需要分析clang的源码了,LLVM这个开源的project代码写的很不错的,也算是巩固一下C++的一些基础知识了。

首先是在llvm/ADT/OwningPtr.h中定义了owningptr智能指针的实现:

源码如下:

 1 /// OwningPtr smart pointer - OwningPtr mimics a built-in pointer except that it
 2 /// guarantees deletion of the object pointed to, either on destruction of the
 3 /// OwningPtr or via an explicit reset().  Once created, ownership of the
 4 /// pointee object can be taken away from OwningPtr by using the take method.
 5 template<class T>
 6 class OwningPtr {
 7   OwningPtr(OwningPtr const &) LLVM_DELETED_FUNCTION;
 8   OwningPtr &operator=(OwningPtr const &) LLVM_DELETED_FUNCTION;
 9   T *Ptr;
10 public:
11   explicit OwningPtr(T *P = 0) : Ptr(P) {}
12
13 #if LLVM_HAS_RVALUE_REFERENCES
14   OwningPtr(OwningPtr &&Other) : Ptr(Other.take()) {}
15
16   OwningPtr &operator=(OwningPtr &&Other) {
17     reset(Other.take());
18     return *this;
19   }
20 #endif
21
22   ~OwningPtr() {
23     delete Ptr;
24   }
25
26   /// reset - Change the current pointee to the specified pointer.  Note that
27   /// calling this with any pointer (including a null pointer) deletes the
28   /// current pointer.
29   void reset(T *P = 0) {
30     if (P == Ptr) return;
31     T *Tmp = Ptr;
32     Ptr = P;
33     delete Tmp;
34   }
35
36   /// take - Reset the owning pointer to null and return its pointer.  This does
37   /// not delete the pointer before returning it.
38   T *take() {
39     T *Tmp = Ptr;
40     Ptr = 0;
41     return Tmp;
42   }
43
44   T &operator*() const {
45     assert(Ptr && "Cannot dereference null pointer");
46     return *Ptr;
47   }
48
49   T *operator->() const { return Ptr; }
50   T *get() const { return Ptr; }
51   LLVM_EXPLICIT operator bool() const { return Ptr != 0; }
52   bool operator!() const { return Ptr == 0; }
53   bool isValid() const { return Ptr != 0; }
54
55   void swap(OwningPtr &RHS) {
56     T *Tmp = RHS.Ptr;
57     RHS.Ptr = Ptr;
58     Ptr = Tmp;
59   }
60 };

涉及知识点:

(一)智能指针:在堆栈上实现对原始指针的控制,对RAII至关重要;类似于垃圾回收机制,智能的回收不需要的使用的指针。

参考:http://msdn.microsoft.com/zh-cn/vstudio/hh279674(v=vs.80).aspx

源码中实现了get、reset等重要的接口函数。

(二)运算符重载:

1、上述源码的第8行当中,重载赋值运算符为何返回引用呢?因为这样返回的值既可以当左值也可以当右值

2、http://blog.csdn.net/zgl_dm/article/details/1767201

(三)不要返回局部变量的引用

在上述源码可以看到,几个重载函数都返回了引用,但是不是局部变量的。

http://blog.sina.com.cn/s/blog_40965d3a0101eaiq.html

一旦局部变量超过作用域释放了资源,使用的时候就会出现问题了。

(四)模板以及explicit等知识就暂且不介绍了

从LLVM源码学C++(一),布布扣,bubuko.com

时间: 2024-10-10 04:34:19

从LLVM源码学C++(一)的相关文章

从LLVM源码学C++(五)

知识点:static,const,static const 详解:转(http://blog.csdn.net/yjkwf/article/details/6067267) const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. static表示的是静态的.类的静态成员函数.静态成员变量是和类相关的,而不是和类的具体对象相关的.即使没有具体对象,也能调用类的静态成员函数和成员变量.一般类的静态函数几乎就是一个全局函数,只不过它的作用域限

从LLVM源码学C++(四)

关键知识点:断言 1 const Option OptTable::getOption(OptSpecifier Opt) const { 2 unsigned id = Opt.getID(); 3 if (id == 0) 4 return Option(0, 0); 5 assert((unsigned) (id - 1) < getNumOptions() && "Invalid ID."); 6 return Option(&getInfo(id

从LLVM源码学C++(三)

关键知识点:mutable关键字 mutable关键字: mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中. 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的.但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mut

从LLVM源码学C++(二)

在看Clang源码的过程中遇到过,返回const引用,于是就去google 了一下返回值以及参数传递等相关的知识. 首先,为什么要(const 引用)的返回值? 首先&的引用作用是C++独有的特性.其作用相当于传入参数时不经过拷贝,而是实实在在的传入. fun(int &a).如果在函数内部修改了a的值,那就确实修改了a的值.而一般的参数传入方式都是传入一个参数的副本.函数内部的操作都是作用于副本. 对于返回值,也类似.一般返回值也是返回的拷贝值.所以如果将函数内的局部变量以引用方式返回是

从LLVM源码学C++(六)

今天看clang的有关DeclSpec.h,看到有关关键字的一些信息.这里总结一下 知识点:各种关键字 C++关键字(static/register/atuo/extern/volatile/const)释疑 下面关于C++的几个关键字是经常和我们打交道的而我们又经常对这些含糊不清的, 本文根据自己的学习体会作以总结,以期达到真正理解和活用的目的. static 静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可改变其值. 静态变量或静态函数,即只有本文件

Java读源码学设计模式:适配器Adapter

适配器模式相关源码:slf4j-1.6.1.hibernate-3.6.7 大家都知道,log4j是一个广泛使用的日志工具,除此之外,sun公司在JDK中也有自己的日志工具,也就是java.util.logging.Logger.当然还有其他一些日志工具. 多种日志工具功能和使用方式类似,一般都包含debug.info.warn.error等日志级别的方法,但却没有实现共同的接口.这一点不像JDBC,虽然关系型数据库种类很多,例如MySQL.Oracle等,但是有一套统一的接口,也就是JDBC.

读源码学编程之——死循环妙用

现假设有一个整型数组: Integer[] arr = {20, 20, 4, 4, 21, 7}; // 2020年4月4日21时7分 如何用逗号加空格 “, ” 分割数组元素并放置在“[]”中从而获得如下格式的数组元素字符串呢? [20, 20, 4, 4, 21, 7] Show you the code. 我是这样写的: public static String toString(Object[] arr) { if (arr == null) { return "null";

跟我学SpringMVC目录汇总贴、PDF下载、源码下载

跟我学SpringMVC目录汇总贴.PDF下载.源码下载 http://jinnianshilongnian.iteye.com/blog/1752171 跟开涛学SpringMVC 在线版目录 第一章 Web MVC简介 第二章 Spring MVC入门 第三章 DispatcherServlet详解 第四章 Controller接口控制器详解(1) 第四章 Controller接口控制器详解(2) 第四章 Controller接口控制器详解(3) 第四章 Controller接口控制器详解(

菜鸟学jQuery源码(一)

整个jQuery是一个自调用的匿名函数: 1 (function(global, factory) { 2 if (typeof module === "object" && typeof module.exports === "object") { 3 module.exports = global.document ? 4 factory(global, true) : 5 function(w) { 6 if (!w.document) { 7