0
点赞
收藏
分享

微信扫一扫

嵌入式实时系统使用C++的准备工作.


都知道,C++ operator new是语言特性而并非库函数,既然是语言特性,必须为编译器所支持,那么在嵌入式实时系统中,不存在C++ Runtime, operator new是如何和RTOS的堆内存分配挂接的呢?

因下面这段函数为例:

嵌入式实时系统使用C++的准备工作._纯虚函数

对应的cpp代码如下:

嵌入式实时系统使用C++的准备工作._实时系统_02

猜测符号_Znwj为operator new调用,用c++filt进行名字翻译后看是不是:

嵌入式实时系统使用C++的准备工作._c++_03

再进_Znwj内部看细节:

嵌入式实时系统使用C++的准备工作._语言特性_04

对应的源码实现:

嵌入式实时系统使用C++的准备工作._纯虚函数_05

delete/delete[], new/new[]的namemangling结果如下:

嵌入式实时系统使用C++的准备工作._纯虚函数_06

所以可以看到,虽然是语言特性支持operator new,但是由于嵌入式实时系统和Linux系统的本质差异,不存在同一的CPP runtime库,所以,和RTOS系统的对接必须由开发者自己去实现。

关于全局对象构造:

嵌入式实时系统使用C++的准备工作._实时系统_07

通过遍历__ctors_start__和__ctors_end__之间的指针,实现全局构造函数的调用。

 对应链接脚本的符号定义:

嵌入式实时系统使用C++的准备工作._语言特性_08

__cxa_pure_virtual函数是在调用纯虚函数时调用的错误处理程序, 如果正在编写具有纯虚函数的C ++应用程序,则必须提供自己的__cxa_pure_virtual,它被安插在纯虚类的virtual function table表中,由于纯虚类不能实例化,纯虚函数不能被调用,所以实现为调试循环,或者打印出错信息。

namemanling后的C调用:

为了支持函数重载,CPP支持了函数签名机制,相同函数名的重载函数会根据参数列表的不同,被编码为独一无二的名字,C++内部由于遵守同样的约定,当然可以互相调用,但是对C语言编码的代码就不一样了,它不认识名字改编之后的函数名,这时,就需要extern c机制。

嵌入式实时系统使用C++的准备工作._纯虚函数_09

例子: 

嵌入式实时系统使用C++的准备工作._c++_10

嵌入式实时系统使用C++的准备工作._c++_11

嵌入式实时系统使用C++的准备工作._纯虚函数_12

嵌入式实时系统使用C++的准备工作._c++_13

结束!

举报

相关推荐

0 条评论