好记性不如烂笔头,今天要学习的是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运算符重载的实现是下面这样的:

void

operator 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;

}

android源代码 abi,Android内核源码Abi目录学习笔记相关推荐

  1. 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记

    生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...

  2. CNN入门详解及TensorFlow源码实现--深度学习笔记

    CNN入门详解及TensorFlow源码实现–深度学习笔记 ##一.卷积神经网络 ###1.简介 卷积神经网络是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出 ...

  3. 鸿蒙系统源代码解析,鸿蒙内核源码分析(系统调用篇) | 图解系统调用全貌

    本篇说清楚系统调用 读本篇之前建议先读鸿蒙内核源码分析(总目录)工作模式篇. 本篇通过一张图和七段代码详细说明系统调用的整个过程,代码一捅到底,直到汇编层再也捅不下去. 先看图,这里的模式可以理解为空 ...

  4. 玩转腾讯首发Linux内核源码《嵌入式开发笔记》

    一.前言 Linux内核是一种开源电脑操作系统内核,它是一个用C语言写成,符合POSIX标准的类Unix操作系统. Linux内核最早是由芬兰Linus Torvalds为尝试在英特尔x86架构上提供 ...

  5. puppet最新源码包安装学习笔记

    最近去面试了2家大的电商网站的运维工作,公司对系统的自动化管理,虚拟化,mysql集群,系统性能的优化和shell及python编程的要求都比较高,虽然没有面试成功,但也明白了2013年自己学习的目标 ...

  6. 源码 状态机_LLVM学习笔记(1)--初探源码

    一直耳闻LLVM相比于GCC: well documented 架构灵活,前后端解耦符合龙书的讲解 昨天读到了一篇虽然概括却很周到的llvm入门导引 陈钦霖:LLVM Pass入门导引​zhuanla ...

  7. mysql数据库源码安装_学习笔记-源码安装mariadb 20210128

    源码安装Mariadb数据库 安装之前先检查一下空间: 1 [15:13:16 root@centos8 ~]#free -h(#检查空间)2 total used free shared buff/ ...

  8. 18、HTTP基本操作及源码编译安装 学习笔记

    HTTPHyper Text Transfer Protocol超文本传输协议 HTMLHyper Text Mark-up Language超文本标记语言 URIUniform Resource I ...

  9. ConcurrentHashMap源码jdk1.8学习笔记

    目录 put方法 initTable方法 helpTransfer方法 transfer方法 addCount方法 put方法 public V put(K key, V value) {// 直接调 ...

最新文章

  1. 深度神经网络中的归一化技术
  2. JSP+MySQL实例
  3. openwrt 遍译php_[OpenWrt Wiki] OpenWrt编译 – 说明
  4. 什么是流量劫持,如何防止流量劫持?
  5. CG CTF WEB bypass again
  6. 治疗拖延症晚期患者的三张处方
  7. VK Cup 2015 - Qualification Round 1 A. Reposts(树)
  8. 用了5年Excel,换了这个神奇的报表工具,不禁感叹:国产真香
  9. 中国人去日本买电饭煲令人痛心!董明珠:难道我泱泱大国造不出吗?
  10. Flex Module优化
  11. linux特殊权限SUID,SGID和SBIT的介绍
  12. 怎样才算是一个好的老师???
  13. MATLAB一句总结
  14. Flash小游戏星空大战SpaceBattleGame 源代码
  15. RHadoop协同过滤算法
  16. 主板usb接口全部失灵_usb接口没反应,主板usb接口全部失灵
  17. 记一次简单的分区加LVM划分练习
  18. python api文档生成二维码_使用Python第三方库生成二维码
  19. 浮点数到整数的快速转换
  20. 【1】学习前言及数据分析的简单介绍jupyter的介绍与安装

热门文章

  1. gcc 自动识别的文件扩展名,gcc/g++ -x 选项指定语言,不同 gcc 版本 -std 编译选项支持列表
  2. Linux shell 学习笔记(8)— 使用结构化命令(if-then 语句、数值比较、字符串比较、文件比较、case 语句)
  3. 微机原理—定时计数控制接口
  4. 【UML建模】机房中的UML图
  5. Python:pip 和pip3的区别
  6. npm install遇到ENOENT: no such file or directory, rename错误
  7. 软件工具将GPU代码迁移到fpga以用于AI应用
  8. 画布Canvas的使用
  9. 2021年大数据ELK(二十四):安装Kibana
  10. hook情况下,解决内联没有:hover的方案