android源代码 abi,Android内核源码Abi目录学习笔记
好記性不如爛筆頭,今天要學(xué)習(xí)的是Android中Abi目錄下的代碼。下面是基本的學(xué)習(xí)的筆記的匯總。
首先是include中的頭文件的說明。
在cxxabi的頭文件中主要需要掌握下面的幾個(gè)點(diǎn):
1、這個(gè)頭文件中包含的主要的功能就是基于C++ 2.9.5中的驅(qū)動(dòng)的類型的信息。
2、驅(qū)動(dòng)的類型這里面主要定義了這么幾類:
2、1? __fundamental_type_info? 基本驅(qū)動(dòng)類型的信息
2、2 __array_type_info 數(shù)組驅(qū)動(dòng)類型的信息
2、3 __function_type_info函數(shù)驅(qū)動(dòng)類型的信息
2、4 __enum_type_info枚舉驅(qū)動(dòng)類型的信息
2、5 __class_type_info沒有父類的類的驅(qū)動(dòng)類型的信息
2、7 __si_class_type_info是__class_type_info的子類,其中包含了一個(gè)單例、公有非虛的,偏移量為0的指向的是__class_type_info的類型的指針。
const __class_type_info *__base_type;
在new的頭文件中主要需要掌握下面的幾個(gè)點(diǎn):
1、主要是一些操作符的重載
2、被重載的操作符主要有:new 、new[ ]、delete、delete[ ]
2、同時(shí)每一個(gè)操作符的重載基本上都要聲明拋出異常
在typeinfo的頭文件中需要掌握下面的幾個(gè)點(diǎn):
1、主要是定義了type_info的一些操作(主要還是一些操作符的重載)(基于C++ 2.9.3的片段)
接下來是src中的源碼文件的說明。
1、主要是一些驅(qū)動(dòng)類型的信息的實(shí)現(xiàn),其中絕大多數(shù)的實(shí)現(xiàn)是一些空實(shí)現(xiàn),僅僅包括一個(gè)析構(gòu)函數(shù)。
2、其中數(shù)組驅(qū)動(dòng)類型、類驅(qū)動(dòng)類型、枚舉驅(qū)動(dòng)類型、函數(shù)驅(qū)動(dòng)類型、基本數(shù)據(jù)驅(qū)動(dòng)類型、指針指向成員變量驅(qū)動(dòng)類型、指針驅(qū)動(dòng)類型等都是處了有一個(gè)析構(gòu)函數(shù)的空的定義,其余什么都沒有的源碼。
3、對(duì)于delete運(yùn)算符重載的實(shí)現(xiàn)是下面這樣的:
void
operator delete(void* ptr) throw()
{
if (ptr)
free(ptr);
}
調(diào)用free方法釋放指向的存儲(chǔ)空間。
4、對(duì)于new運(yùn)算符的重載方法如下:
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;
}
調(diào)用malloc函數(shù)分配需要的存儲(chǔ)空間,如果分配失敗,拋出異常。
5、在dynamic_cast的源碼中,需要注意下面的幾個(gè)點(diǎn):
5、1? 通過偏移量調(diào)整一個(gè)指針的指向
5、2? 返回一個(gè)通過指針指向的多態(tài)的對(duì)象的指針的虛擬表
5、3? 返回在一個(gè)虛擬表中的一個(gè)指針指向的類驅(qū)動(dòng)類型的信息
5、4? 返回在一個(gè)虛擬表中,相對(duì)于一個(gè)對(duì)象的偏移量。
5、5? 如何去迭代一個(gè)對(duì)象的類型的樹
const void *
walk_object(const void *object,
const abi::__class_type_info *type,
const void *match_object,
const abi::__class_type_info *match_type)
{
//如果當(dāng)前的對(duì)象的類型與當(dāng)前的等待迭代的指針是相同的
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;
}
總結(jié)
以上是生活随笔為你收集整理的android源代码 abi,Android内核源码Abi目录学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 换驾驶证需要交多少钱,体检费是多少钱
- 下一篇: 一瓶白酒多少钱啊?