好记性不如烂笔头,今天要学习的是Android中Abi目录下的代码。下面是基本的学习的笔记的汇总。

首先是include中的头文件的说明。

在cxxabi的头文件中主要需要掌握下面的几个点:

1、这个头文件中包含的主要的功能就是基于C++ 2.9.5中的驱动的类型的信息。

2、驱动的类型这里面主要定义了这么几类:

2、1  __fundamental_type_info  基本驱动类型的信息

2、2 __array_type_info 数组驱动类型的信息

2、3 __function_type_info函数驱动类型的信息

2、4 __enum_type_info枚举驱动类型的信息

2、5 __class_type_info没有父类的类的驱动类型的信息

2、7 __si_class_type_info是__class_type_info的子类,其中包含了一个单例、公有非虚的,偏移量为0的指向的是__class_type_info的类型的指针。

const __class_type_info *__base_type;

在new的头文件中主要需要掌握下面的几个点:

1、主要是一些操作符的重载

2、被重载的操作符主要有:new 、new[ ]、delete、delete[ ]

2、同时每一个操作符的重载基本上都要声明抛出异常

在typeinfo的头文件中需要掌握下面的几个点:

1、主要是定义了type_info的一些操作(主要还是一些操作符的重载)(基于C++ 2.9.3的片段)


接下来是src中的源码文件的说明。

1、主要是一些驱动类型的信息的实现,其中绝大多数的实现是一些空实现,仅仅包括一个析构函数。

2、其中数组驱动类型、类驱动类型、枚举驱动类型、函数驱动类型、基本数据驱动类型、指针指向成员变量驱动类型、指针驱动类型等都是处了有一个析构函数的空的定义,其余什么都没有的源码。

3、对于delete运算符重载的实现是下面这样的:

voidoperator delete(void* ptr) throw(){  if (ptr)    free(ptr);}

调用free方法释放指向的存储空间。

4、对于new运算符的重载方法如下:

void*operator new(std::size_t size) throw (/*std::bad_alloc*/){  void* ptr = malloc(size);#if 0  if (ptr == NULL)    throw std::bad_alloc();#endif  return ptr;}

调用malloc函数分配需要的存储空间,如果分配失败,抛出异常。

5、在dynamic_cast的源码中,需要注意下面的几个点:

5、1  通过偏移量调整一个指针的指向

5、2  返回一个通过指针指向的多态的对象的指针的虚拟表

5、3  返回在一个虚拟表中的一个指针指向的类驱动类型的信息

5、4  返回在一个虚拟表中,相对于一个对象的偏移量。

5、5  如何去迭代一个对象的类型的树

  const void *  walk_object(const void *object,              const abi::__class_type_info *type,              const void *match_object,              const abi::__class_type_info *match_type)  {//如果当前的对象的类型与当前的等待迭代的指针是相同的 if (*type == *match_type)      return (match_object == NULL || object == match_object) ? object : NULL;    switch(type->code())      {      case abi::__class_type_info::CLASS_TYPE_INFO_CODE:        // This isn't not the class you're looking for.        return NULL;      case abi::__class_type_info::SI_CLASS_TYPE_INFO_CODE:        // derived type has a single public base at offset 0.        {          const abi::__si_class_type_info* ti =            static_cast(type);          return walk_object(object, ti->__base_type, match_object,                             match_type);        }      case abi::__class_type_info::VMI_CLASS_TYPE_INFO_CODE:        {          const void* vtable = get_vtable(object);          const abi::__vmi_class_type_info* ti =            static_cast(type);          // Look at all direct bases.          const void* result = NULL;          for (unsigned i = 0; i < ti->__base_count; ++i)            {              if (!ti->__base_info[i].is_public())                continue;              const void *subobject =                get_subobject(object, vtable, &ti->__base_info[i]);              const void* walk_subobject_result =                walk_object(subobject, ti->__base_info[i].__base_type,                            match_object, match_type);              if (walk_subobject_result == ambiguous_object)                return ambiguous_object;              else if (walk_subobject_result != NULL)                {                  if (result == NULL)                    {                      result = walk_subobject_result;                    }                  else if (result != walk_subobject_result)                    return ambiguous_object;                }            }          return result;        }      default:        assert(0);      }    return NULL;  }





更多相关文章

  1. 智能指针和弱引用 zz .
  2. 使用LocationManager来获取移动设备所在的地理位置信息
  3. 用tcpdump抓取Android的网络数据包
  4. Android根据经纬度获取城市名的方法
  5. 简单易用的Android日志框架Logger试用
  6. Android(安卓)工具类 —— 判断网络连接状态、GPS是否打开、基站
  7. Android(安卓)学习笔记 databinding简单使用:使用databinding在li
  8. android 反射应用
  9. android 自定义信息提示框

随机推荐

  1. Android P SystemUI下拉时,状态栏和通知栏
  2. [Android] IntentFilter-->Action、Categ
  3. kotlin Unresolved reference: kotlinx
  4. android wifi 相关方面整理
  5. Android(安卓)开发中 iBeacon的使用
  6. Android和iPhone婚了
  7. Android的OpenGL学习笔记(6)
  8. 对TextView ImageView 设置了drawable se
  9. 5分钟理解Android中的上下文!!!
  10. Android实现控件View移动控制。