Android之性能监控框架
[TOC]
概述dynamic_cast将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理。
主要用途:将基类的指针或引用安全地转换成派生类的指针或引用,并用派生类的指针或引用调用非虚函数。如果是基类指针或引用调用的是虚函数无需转换就能在运行时调用派生类的虚函数。
转换方式:
123456dynamic_cast< type* >(e) // type必须是一个类类型且必须是一个有效的指针 dynamic_cast< type& >(e) // type必须是一个类类型且必须是一个左值 dynamic_cast< type&& >(e) // type必须是一个类类型且必须是一个右值
e的类型必须符合以下三个条件中的任何一个:1、e的类型是目标类型type的公有派生类2、e的类型是目标type的共有基类3、e的类型就是目标type的类型。
Android之性能监控框架
[TOC]
概述C++开发中我们会经常用到插入操作对stl的各种容器进行操作,比如vector,map,set等。在引入右值引用,转移构造函数,转移复制运算符之前,通常使用push_back()向容器中加入一个右值元素(临时对象)时,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题就是临时变量申请资源的浪费。引入了右值引用,转移构造函数后,push_back()右值时就会调用构造函数和转移构造函数,如果可以在插入的时候直接构造,就只需要构造一次即可。这就是C++11 新加的emplace_back。
emplace_back函数原型:
12template <class... Args> void emplace_back (Args&&... args);
在容器尾部添加一个元素,这个元素原地构造,不需要触发拷贝构造和转移构造。而且调用形式更加简洁,直接根据参数初始化临时对象的成员。
一个很有用的例子:
1234567891011121314151617181920 ...
Android之性能监控框架
[TOC]
概述概述想要了解C++11特性里面的move函数的使用和原理,我们先要了解一下左值和右值
左值和右值左值与右值的根本区别在于是否允许取地址&运算符获得对应的内存地址。
一般来说,变量可以取地址,所以是左值,但是常量和临时对象等不可以取地址,所以是右值。
左值的声明符号为&,右值的声明符号为&&。
我们可能在各种场合(初始化,push_back,函数返回等)调用拷贝构造函数将一个临时对象初始化给另一个对象,而这时如果是深拷贝则代价会比较大。
深拷贝对程序的影响比较大,把临时对象的内容直接移动(move)给被赋值的左值对象,效率改善将是显著的。这就产生了移动语义,右值引用是用来支持转移语义的。
Android之性能监控框架
[TOC]
Android之性能监控框架
[TOC]
概述库是已经写好的,成熟的,可以复用的代码。程序员编程的时候都要依赖很多基础的底层库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。
回顾将源程序到可执行程序的过程:
查看静态库连接的外部库123456789101112131415161718192021222324252627282930313233(base) readelf -d libvision.so Dynamic section at offset 0x579150 contains 35 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libopencv_calib3d.so.2.4] 0x0000000000000001 (NEEDED) Shared library: [libopencv_highgui ...
Android之性能监控框架
[TOC]
文章参考:https://blog.csdn.net/a3192048/article/details/82499164
概述
C++中常见问题解决方案汇总
[TOC]
文章参考:https://blog.csdn.net/a3192048/article/details/82499164
概述问题:non-const static data member must be initialized out of line非const的静态值初始化必须在类外。
1234567正确的写法:#include<iostream>int static i = 0;class Base{}
问题:in-class initializer for static data member of type ‘const double’ is a GNU extension解释链接:http://stackoverflow.com/questions/370283/why-cant-i-have-a-non-integral-static-const-member-in-a-class
类中的静态常量声明只可以是整形。
1234567// 正确的写法:#include<iostream>class Base ...
Android之性能监控框架
[TOC]
文章参考:https://elloop.github.io/c++/2015-11-28/never-proficient-cpp-vaargs
文章参考:https://www.cnblogs.com/alinh/p/9025858.html
概述
Android之性能监控框架
[TOC]
概述Makefile 文件描述了 Linux 系统下 C/C++ 工程的编译规则,它用来自动化编译 C/C++ 项目。一旦写编写好 Makefile 文件,只需要一个 make 命令,整个工程就开始自动编译,不再需要手动执行 GCC 命令。
一个中大型 C/C++ 工程的源文件有成百上千个,它们按照功能、模块、类型分别放在不同的目录中,Makefile 文件定义了一系列规则,指明了源文件的编译顺序、依赖关系、是否需要重新编译等。
这套 Makefile 入门教程针对有 C/C++ 基础的读者,如果你还不了解 C/C++,请转到《C语言教程》《C++教程》进行学习。Makefile 文件可以很复杂,它的语法甚至不比C语言简单;本教程化繁为简,以口语化和通俗化的手法来讲解每个知识点,同时附带大量实例,让读者学以致用。
C++中的Lamda表达式学习
[TOC]
概述