Android
文章平均质量分 71
gaosiniquanjia
这个作者很懒,什么都没留下…
展开
-
【无标题】
面试经常遇到std::move,同时也确实存在一些知识点需要整理,在这里总结一下。1、左值和右值左值与右值的根本区别在于是否允许取地址&运算符获得对应的内存地址。一般来说,变量可以取地址,所以是左值,但是常量和临时对象等不可以取地址,所以是右值。左值的声明符号为&,右值的声明符号为&&。2、右值引用的作用与移动语义我们可能在各种场合(初始化,push_back,函数返回等)调用拷贝构造函数将一个临时对象初始化给另一个对象,而这时如果是深拷贝则代价会比较转载 2022-04-16 16:20:55 · 108 阅读 · 0 评论 -
C++中的using的作用
1.using 命名空间 C++为了减少全局类和变量之间的冲突,引入命名空间的概念,类和变量可以属于某个命名空间。 namespace tesseract { class className { }; } 在某个文件中使用该命名空间中的类有两种方式: 方式一:tesseract::className classInstance; 方式二:using namespace tesser...转载 2022-04-02 11:21:54 · 772 阅读 · 0 评论 -
Binder线程池学习之startThreadPool,joinThreadPool
在Binder通信机制里,客户端与服务端之间的通信是在专门的IPC通信线程中进行的。这些线程构成一个线程池。线程的创建和销毁是在用户空间进行的,而对线程的控制是在驱动层进行的,即驱动控制线程池中线程的生命,而线程本身则是运行在用户空间的。驱动层是通过BR_SPAWN_LOOPER向用户空间发送创建新线程的命令。线程池的大小可以设置, 如果没有主动去设置这个大小,则默认大小为15,如下代码所示:在ProcessSate.cpp在构造函数里,会调用open_driver函数,里面会进行线程池默认大小的设原创 2022-03-22 14:25:47 · 2497 阅读 · 0 评论 -
startThreadPool调用流程
ProcessState::self()->startThreadPool();1、startThreadPool()的主要作用是:(ProcessState.cpp)调用spawnPooledThread( true )2、spawnPooledThread这个函数里面主要作用是:(ProcessState.cpp)启动一个线程sp<Thread> t = new PoolThread(isMain);t->run(buf); //最终就会执行Po...原创 2022-03-21 19:21:13 · 1131 阅读 · 0 评论 -
Binder驱动之内存管理
内存映射用户空间在使用Binder进行IPC前,需要对Binder驱动进行初始化,这个过程主要执行了Binder驱动的open和mmap操作。mmap映射Binder传输使用的内存空间,大小为(1M - 8K),但仅仅是进行虚拟地址空间映射,实际的物理内存分配会在数据传输时进行。mmap的源码如下, static int binder_mmap(struct file *filp, struct vm_area_struct *vma) { int ret;转载 2022-02-22 14:40:00 · 388 阅读 · 0 评论 -
Android Looper和Handler
Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起原创 2021-11-17 14:57:52 · 55 阅读 · 0 评论