- 博客(64)
- 资源 (17)
- 收藏
- 关注
原创 Android平台内存分析
1、介绍有的时候我们会发现应用堆内存和设备内存都非常充足,还是会出现内存分配失败的情况,这跟资源泄漏可能有比较大的关系。1、文件句柄 fd。文件句柄的限制可以通过 /proc/self/limits 获得,一般单个进程允许打开的最大文件句柄个数为 1024。但是如果文件句柄超过 800 个就比较危险,需要将所有的 fd 以及对应的文件名输出到日志中,进一步排查是否出现了有文件或者线程的泄漏。2、线程数。当前线程数大小可以通过上面的 status 文件得到,一个线程可能就占 2MB 的虚拟内存,过
2020-07-12 23:42:12
442
原创 MVP、MVC和MVVM设计架构
1、MVVM定义MVVM是Model-View-ViewModel的简写,即模型-视图-视图模型。【模型】指的是后端传递的数据。【视图】指的是所看到的页面。【视图模型】mvvm模式的核心,它是连接view和model的桥梁。它有两个方向:一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据...
2020-03-29 19:29:51
265
原创 Java泛型
为什么使用泛型?用Object不行吗?答案是可以的!也就是说泛型可以实现的功能,用Object也是可以实现的。因为泛型有如下优点:1、无须类型强转,提高效率,避免了强转出错。2、通配符"?"的使用提高了程序的阅读性。3、限制通配符(<? extends T>、<? super T>)提高了程序的健壮性。Java泛型约束点:1、不能使用基本数据类型实例...
2020-03-28 15:01:13
288
原创 Java GC机制和内存分配
JAVA运行时数据区:1、Method Area 方法区;1、存储已被虚拟机加载的类信息、常量、静态变量、即使编译后的代码等数据;2、运行时常量池 3、线程独享的;2、VM Stack 虚拟堆栈区;3、Native Method Stack 本地方法栈;1、调用本地native的内存模型 2、线程独享;4、Heap 堆;1、线程共享的 2、虚拟机启动的时候创建的 3、对象实例 ;...
2020-03-26 16:25:19
283
原创 OpenGL高级GLSL
顶点着色器的输出向量gl_Position,和片段着色器的gl_FragCoord;gl_PointSize:其中一个图元是GL_POINTS,如果使用它的话,每一个顶点都是一个图元,都会被渲染为一个点。我们可以通过OpenGL的glPointSize函数来设置渲染出来的点的大小,但我们也可以在顶点着色器中修改这个值。GLSL定义了一个叫做gl_PointSize输出变量,它是一个fl...
2020-03-15 20:24:28
357
原创 设计模式--设计原则
1 开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向对象软件构造》(Object Oriented Software Construction)中提出:软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed ...
2020-01-05 19:47:55
179
原创 设计模式--初探
单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。 工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。 抽象工厂(AbstractFactory)...
2020-01-02 23:51:17
157
原创 Linux文件系统和进程简介
1 U N I X文件系统是目录和文件的一种层次安排,目录的起点称为根( r o o t ),其名字是一个字符/。目录(d i r e c t o r y)是一个包含目录项的文件,在逻辑上,可以认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。文件属性是:文件类型,文件长度,文件所有者,文件的许可权(例如,其他用户能否能访问该文件),文件最后的修改时间等。s t a t和f s ...
2019-12-08 21:09:07
345
原创 算法--快速排序
1 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用;基本思想:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。int AdjustArray(int s[], int l, in...
2019-10-27 10:21:56
137
原创 最全C++知识点--面向对象程序设计
1 面向对象程序设计三个基本概念:数据抽象、继承和动态绑定;2 在C++语言中,当我们使用基类的引用(或指针)调用一个虚函数时将发生动态绑定;派生类经常(但 不总是)覆盖它继承的虚函数。如果派生类没有覆盖其基类中的某个虚函数,则该虚函数的行为类似于其他的普通函数;3 派生类实现:Quote item; //基类对象Bulk_quote bulk; //派生类对象Quote...
2019-10-26 11:25:56
1204
原创 最全C++知识点--静态绑定和动态绑定
1 在C++中,为了支持c++的多态性,才用了动态绑定和静态绑定。对象的静态类型:对象在声明时采用的类型。是在编译期确定的。对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。静态绑定:绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期。动态绑定:绑定的是对象的动态类型,某特性(比如函数)依赖于对象的动态类型...
2019-10-25 10:31:34
279
原创 算法--堆
1堆就是用数组实现的二叉树,所有它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。堆属性:堆分为两种:最大堆和最小堆,两者的差别在于节点的排序方式。在最大堆中,父节点的值比每一个子节点的值都要大。在最小堆中,父节点的值比每一个子节点的值都要小。这就是所谓的“堆属性”,并且这个属性对堆中的每一个节点都成立。一个堆中的节点的高度为该节点到根节点最长简...
2019-10-22 20:15:19
287
原创 算法--散列表
1 散列表的定义:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f...
2019-10-20 10:33:06
471
原创 Android约束布局
1 使用constraintLayout原因在开发过程中遇到一些复杂的UI,可能会出现嵌套过多的问题,嵌套的越多,设备视图所需的时间和计算功耗就越多;它同时支持LinearLayout与RelativeLayout的所用特性。同时它完全通过约束来减少布局的嵌套。意思就是基本上最外层只需要一个ConstraintLayout节点就可以了;2 如何使用constraintLayout首先我...
2019-10-13 20:01:29
326
原创 最全C++知识点--重载运算与类型转换
1 重载运算符是具有特殊名字的函数,由关键字operator和其后要定义的运算符号共同组成。当一个重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数的参数数量比运算对象的数量少一个;2 通常情况下,不应该重载逗号、取地址、逻辑与和逻辑或运算符;不能被重载的运算符 :: .* . ?:3 重载输出运算符<<ostream &o...
2019-10-11 00:08:39
169
原创 最全C++知识点--拷贝控制
1 拷贝构造函数:一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,此构造函数是拷贝构造函数;2 拷贝构造函数被用了初始化非引用类型参数,这一特性解释了为什么拷贝构造函数自己的函数必须是引用类型。如果参数不是引用类型,则调用永远也不会成功—为了调用拷贝构造函数,我们必须拷贝它的实参,但为了拷贝实参,我们又需要调用拷贝构造函数,无限循环;3 当类内用=default修饰...
2019-10-09 22:56:23
146
原创 最全C++知识点--动态内存
1 对于局部自动对象,当我们进入其定义所在的程序块时被创建,在离开块时销魂。局部static对象在第一次使用前分配,在程序结束时销魂。除了这些外,C++还支持动态分配内存对象。动态分配对象的生存期与它们在哪里创建无关,只有当显示释放时,这些对象才会被销毁;2 new在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化;delete接受一个动态对象的指针,销毁该对象...
2019-10-07 09:57:39
207
原创 最全C++知识点--lambda表达式
1 lambda表达式:具有一个返回类型、一个参数列表和一个函数体。[capture list] (parameter list)—>return type{function body}void biggies(vector<string> &words){ stable_sort(words.begin(),words.end(),...
2019-09-22 22:41:37
225
原创 最全C++知识点--顺序容器
1 顺序容器概述Vector 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。Deque 双端队列。支持快速随机访问。在头尾位置插入/删除速度很快。List 双向链表。只支持双向顺序访问。Forward_list 单向链表。只支持单向顺序访问。Array 固定大小数组。支持快速随机访问。不能添加或删除元素。String 与...
2019-09-15 20:09:31
171
原创 最全C++知识点--类
1 定义在类内部的函数是隐式inline函数的。尽管所有成员都必须在类的内部申明,但是成员函数体可以定义在类内也可以定义在类外。2 定义一个返回this对象的函数class Sales_data { std::string isbn() const { return bookNo; } Sales_data &combine(cons...
2019-09-15 15:55:47
211
原创 OpenGL纹理贴图
1 基础背景如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会产生很多额外开销,因为每个模型都会需求更多的顶点,每个顶点又需求一个颜色属性。纹理对象,纹理单元,采样器对象,采样器一致变量。纹理对象包含它本身纹理图片的数据,比如纹素。纹理可以是不同的类型的(1D,2D等等),分别有不同维度。其底层数据类型有不同的格式(RGB,RGBA等等)。纹理对象并不...
2019-09-14 21:57:48
4793
原创 最全C++知识点--函数
1 函数操作int fact(int val);int main() { int j = fact(5); cout << "5! is " << j << endl; return 0;}int fact(int val) { int ret = 1; while (val >...
2019-09-10 23:09:06
190
原创 最全C++知识点--表达式与语句
1 赋值运算符int i=0,j=0,k=0;const int ci=i;2前置的递增运算符:先算后用,后置的递增运算符:先用后算。递减一样。3 成员访问运算符string s1="a string",*p=&s1;auto n=(*p).size();n=p->size();4 iter的类型是vector<string>::iter...
2019-09-09 23:56:51
261
原创 Java基础知识
对 Java 多态的理解面向对象编程的三大特性:封装、继承、多态。 封装:隐藏类的内部实现机制。 继承:重用父类代码,为多态做铺垫。 多态:程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。 实现多态的三个必要条件:继承、重写、向上转型。 继承:在多态中必须存在有继承关系的子类和父类。 重...
2019-09-08 20:03:35
192
原创 最全C++知识点--字符串、向量和数组
1 位于头文件的代码一般来说不应该使用using声明。头文件的内容会拷贝到所有引用它的文件中,如果头文件里有using声明,那么每个使用该头文件的文件就都会有这个声明。2 读入一整行的函数:string mystring;while (getline(cin , mystring)){ cout<<mystring<<endl;}3对于str...
2019-09-08 19:43:47
384
原创 最全C++知识点--变量和基本类型
1 short和int至少16位,long至少是32位,long long一般是64位的。2 unsigned u=10; int i=-42; u+i=4294967264;先将-42转成无符号数再进行相加。3 转义序列:换行符: \n 横向制表符:\t 报警:\a 纵向制表符:\v退格符:\b 双引号:\” ...
2019-09-08 13:58:01
519
原创 OpenGL透明度
简介透明表示一个物体不是纯色的。透明的物体可以是完全透明的(让所有的颜色穿过),或者是半透明的(它让颜色通过,同时也会显示自身的颜色)。一个物体的透明度是通过它颜色的aplha值来决定的。Alpha颜色值是颜色向量的第四个分量,第四个分量设置为1.0,让这个物体的透明度为0.0,而当alpha值为0.0时物体将会是完全透明的。当alpha值为0.5时,物体的颜色有50%是来自物体自身的颜色,5...
2019-09-08 09:51:03
5219
原创 OpenGL深度测试和模板测试
1.简介深度缓冲就像颜色缓冲(Color Buffer)(储存所有的片段颜色:视觉输出)一样,在每个片段中储存了信息,并且(通常)和颜色缓冲有着一样的宽度和高度。当深度测试(Depth Testing)被启用的时候,OpenGL会将一个片段的的深度值与深度缓冲的内容进行对比。OpenGL会执行一个深度测试,如果这个测试通过了的话,深度缓冲将会更新为新的深度值。如果深度测试失败了,片段将会被...
2019-09-05 22:38:16
933
原创 OpenGL坐标系统和相机空间
在OpenGL的编程中,我们一般使用标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说,每个顶点的x,y,z坐标都应该在-1.0到1.0之间,超出这个坐标范围的顶点都将不可见。一般而言,对使用者比较重要的有5个不同的坐标系统: 局部空间(Local Space,或者称为物体空间(Object Space)) 世界空间(World Sp...
2019-09-04 11:27:32
1272
原创 OpenGL变换操作
变换基础向量最基本的定义就是一个方向。或者更正式的说,向量有一个方向(Direction)和大小(Magnitude,也叫做强度或长度)。位移(Translation)是在原始向量的基础上加上另一个向量从而获得一个在不同位置的新向量的过程,从而在位移向量基础上移动了原始向量。在3D空间中旋转需要定义一个角和一个旋转轴(Rotation Axis)。物体会沿着给定的旋转轴旋转特定角度。如...
2019-09-03 00:59:19
799
原创 GLSL着色器
着色器语言是一种叫GLSL的类C语言。着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数,在这个函数中我们处理所有的输入变量,并将结果输出到输出变量中。当我们特别谈论到顶点着色器的时候,每个输入变量也叫顶点属性(Vertex Attribute)。1 数据类型GLSL中包含C等其它语言大部分的默认基础数据类型:int,fl...
2019-08-26 23:53:17
2521
原创 OpenGL三角形绘制
在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线管理的。图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。1 着色器渲染在3D转换2D过程中,主要就是在GPU上...
2019-08-25 08:42:01
999
原创 OpenGL Create Window
OpenGL 标准没有指定任何用于建立和使用窗口的 API。glutInit(&argc,argv);这个函数是为了初始化 GLUT。里面的参数可以直接从命令行中得到,同时可以包含其他有用的选项比如 '-sync' 和 '-gldebug',这样可以自动的检查GL的错误并独立的显示它们。glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);...
2019-08-11 22:29:45
536
原创 OpenGL索引绘制
OpenGL 提供了多个绘制函数。一般使用的 glDrawArrays()函数属于“顺序绘制”的类别。这意味着顶点缓冲区以指定的偏移量进行扫描,它将每 X( 1 个顶点时表示点,两个顶点表示线,等等)个顶点作为一个图元。这种方法使用起来很方便,但是它的缺点是如果有多个图元共享通一个顶点,那么这个被共享的顶点就会在顶点缓冲区中存在多次。即,在顺序绘制中不存在共享的概念。要实现顶点的共享,我们需要使用...
2019-08-11 21:32:49
750
原创 linux epoll使用原理
1 介绍 Epoll 是一种高效的管理socket的模型,相对于select和poll来说具有更高的效率和易用性。传统的select以及poll的效率会因为 socket数量的线形递增而导致呈二次乃至三次方的下降,而epoll的性能不会随socket数量增加而下降。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。 Epoll...
2019-08-10 21:35:55
821
原创 CMake语法
CMake特点CMake是支持跨平台的构建系统。 可以通过CMakeList.txt方式对其进行管理。CMakeLists.txt主要包含以上的7个步骤:#1.cmake verson,指定cmake版本cmake_minimum_required(VERSION 3.13)#2.project name,指定项目的名称,一般和项目的文件夹名称FirstProject对应P...
2019-07-14 10:47:11
1307
原创 shell基础命令
1 目录移动: cd /user/bin 单点符(.)表示当前目录,双点符(..)表示当前目录的父目录2 查看当前目录绝对路径: pwd3 查看目录文件:ls -F F参数可以轻松区分文件和目录-a 用于将隐藏文件和普通文件及目录一起显示出来-l参数会产生长列表格式的输出4 用touch命令轻松创建空文件:touch test_one5 复制文件:cp source...
2019-07-08 16:56:33
397
原创 C++高级主题
1 函数指针和实参推断Templateint compareInt (*pf1)(const int &,const int &)=compare;2 我们通常见到的引用(int &a=b;)可以称之为左值引用,而右值引用则是int &&a的形式。将左值也绑定到右值引用上,我们可以显式的使用move将一个左值转换为对用的右值引用类型。int a...
2019-06-26 00:36:23
273
原创 C++ Primer类设计者的工具
C++ Primer类设计者的工具1 C++类中有四个不可或缺的部分,那就是构造函数、拷贝构造函数、赋值操作符和析构函数。如果类中没有定义这些函数,那么编译器将为类自动生成这些函数。当然,你也可以通过private控制策略限定不使用拷贝构造函数和赋值操作符。其中,拷贝构造函数、赋值操作符和析构函数总称为拷贝控制(copy control)。当类中有指针类数据成员时,一般都需要自已实现类的拷...
2019-06-20 22:42:56
430
原创 Bazel入门
1 Bazel简介:bazel是Google开源的一套编译构建工具,广泛应用于Google内部,包括TensorFlow项目。修改TensorFlow内部源码,需要使用bazel来编译,故有必要了解下bazel。bazel优点很多,主要有1 构建快。支持增量编译。对依赖关系进行了优化,从而支持并发执行。2 可构建多种语言。bazel可用来构建Java C++ Android ios等很多语...
2019-06-17 23:10:15
5834
Linux系统命令及其使用详解
2012-07-17
vc深入详解
2012-07-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人