日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發(fā)布時(shí)間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android源代码 abi,Android内核源码Abi目录学习笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

好記性不如爛筆頭,今天要學(xué)習(xí)的是Android中Abi目錄下的代碼。下面是基本的學(xué)習(xí)的筆記的匯總。

首先是include中的頭文件的說明。

在cxxabi的頭文件中主要需要掌握下面的幾個(gè)點(diǎn):

1、這個(gè)頭文件中包含的主要的功能就是基于C++ 2.9.5中的驅(qū)動的類型的信息。

2、驅(qū)動的類型這里面主要定義了這么幾類:

2、1? __fundamental_type_info? 基本驅(qū)動類型的信息

2、2 __array_type_info 數(shù)組驅(qū)動類型的信息

2、3 __function_type_info函數(shù)驅(qū)動類型的信息

2、4 __enum_type_info枚舉驅(qū)動類型的信息

2、5 __class_type_info沒有父類的類的驅(qū)動類型的信息

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ū)動類型的信息的實(shí)現(xiàn),其中絕大多數(shù)的實(shí)現(xiàn)是一些空實(shí)現(xiàn),僅僅包括一個(gè)析構(gòu)函數(shù)。

2、其中數(shù)組驅(qū)動類型、類驅(qū)動類型、枚舉驅(qū)動類型、函數(shù)驅(qū)動類型、基本數(shù)據(jù)驅(qū)動類型、指針指向成員變量驅(qū)動類型、指針驅(qū)動類型等都是處了有一個(gè)析構(gòu)函數(shù)的空的定義,其余什么都沒有的源碼。

3、對于delete運(yùn)算符重載的實(shí)現(xiàn)是下面這樣的:

void

operator delete(void* ptr) throw()

{

if (ptr)

free(ptr);

}

調(diào)用free方法釋放指向的存儲空間。

4、對于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ù)分配需要的存儲空間,如果分配失敗,拋出異常。

5、在dynamic_cast的源碼中,需要注意下面的幾個(gè)點(diǎn):

5、1? 通過偏移量調(diào)整一個(gè)指針的指向

5、2? 返回一個(gè)通過指針指向的多態(tài)的對象的指針的虛擬表

5、3? 返回在一個(gè)虛擬表中的一個(gè)指針指向的類驅(qū)動類型的信息

5、4? 返回在一個(gè)虛擬表中,相對于一個(gè)對象的偏移量。

5、5? 如何去迭代一個(gè)對象的類型的樹

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)前的對象的類型與當(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。