自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

qazw9600的专栏

qazw9600的博客

  • 博客(20)
  • 收藏
  • 关注

原创 基础语法 - 泛型编程 - 模板

泛型编程泛型编程是指程序员可以以一种独立于任何特定数据类型的数据操作方式编写算法。模板模板是泛型编程的基础,是创建具体泛型类或函数的蓝图和公式。实现原理模板机制是一种语法糖,通过编译器根据模板创建具有的函数和类实例,编译器处理如下:编译模板本身时, 检查语法信息。使用模板时,检查参数类型是否匹配,数目正确与否;对模板实例化时,进行实参推断。生成具体的函数或类实例。调用具体的实例例如:* 模板定义template <typename T>//先声明模板

2020-05-30 16:36:35 173

原创 基础语法 - 引用

定义引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字,一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。引用和指针上面是引用的常见定义,虽然很好理解,但是初次接触以及实际使用时很容易令人产生困惑:“引用与指针是什么关系?C++既支持指针也支持引用那么实际编程中什么情况下应该使用引用,什么情况下应该使用指针?”个人理解指针是计算机中真实存在的原始元素,而引用是对指针的抽象元素。引用的底层实现其实也是指针,但是引用是指针的抽象概念,抽象出引用的目的是避免指针

2020-05-26 21:04:30 146

原创 受限情况下的程序调试

说明在嵌入式产品开发中,经常出现一些情况,无法使用gdb调试,例如:平台不支持,例如:之前使用一款RK的芯片,芯片原厂告知不支持gdb调试,还未调通。公司可能为了节省成本或者研发一些低档次的产品而舍弃或者减少一些功能和硬件,例如:减少内存大小和存储空间等,导致gdb运行不了。其它设备因素导致gdb运行不了,例如:之前调试一款产品,cpu不足以运行gdb,并且设备只有串口,其它连接方式都不支持,所以也无法使用gdbserver。产品时期导致无法使用gdb调试,例如:大规模老化测试,生产和售后都

2020-05-26 19:43:37 399

原创 面向对象思想 - 面向对象与if else语句

说明面向过程设计和面向对象设计的区别之一:是否在业务逻辑层使用冗余的if else判断,如果你还在大量使用if else,当然,界面表现层除外,即使你使用Java/C#这样完全面向对象的语言,也只能说明你的思维停留在传统的面向过程语言上。个人理解上面的话是在解道技术博客上摘录的,相信在很多博客上有说明,但是大部分没有描述清晰,至少我一时没理解。首先面向对象设计不是完全干掉if else语句,只是尽可能的减少冗余的if else语句,不可能完全不使用,判断是编程的基础元素,如果完全不需要使用,面

2020-05-22 21:32:39 540

原创 编码习惯

判断语句if语句 判断变量是否等于某个立即数,如下:if (p == NULL) //判断指针p是否为空if (a == 1) //判断变量a是否等于1以上写法,有时可能会将"==“写成”=",编译器不能帮助程序员发现问题,为了防止这种异常,建议按照如下方式书写if (NULL == p)if (1 == a)当书写错误将"==“写成”=",由于立即数在前面,立即数是不能赋值的,编译器能发现书写错误。if语句或者switch语句,将出现概率高的放前面,如下:* if 语句if

2020-05-21 19:39:07 150

原创 进程与线程

对于运行宿主cpucpu有单核和双核之分,核心是物理概念,可以简单的将双核cpu看做两个cpu。每个cpu核都有独自的一套寄存器和几级缓存,一个cpu核心同时只能运行一个任务,因此操作系统会给每个cpu核心创建一个进程队列来做进程调度。每个核心存在进程队列,因此就有了cpu负载和cpu占用率的区别,cpu负载关注的是进程队列的的进程数量,而cpu占用率关注的是cpu一段时间内的统计工作时间比。进程调度,cpu 分配区别linux是基于时间片对进程进行调度的,每个进程执行一段时间后,再将cpu

2020-05-19 20:29:55 181

原创 接口说明

说明在C/C++中,函数一般在头文件中声明,实现写在源码文件中,编译后,调用者就看不到源码了,因此应该在头文件中对接口进行描述,以告知函数调用方式和一些额外信息。常见描述信息函数名综合描述参数说明,输入和输出结果说明作者时间自定义格式/* \brief decode h264 frame to jpg or yuv\param decode_type[in] mh264_decode_type_yuv | mh264_decode_type_jpg\pa

2020-05-16 15:07:08 285

原创 代码风格

说明代码可读性差,最基础最直接的的原因就是代码风格不统一。代码风格的统一包含了个人编码风格培养和团队编码风格的统一。个人编码风格个人编程风格就是程序员的编程习惯和代码书写习惯,好的习惯就是好的风格。代码也可以通过格式调整工具调整,但是工具起的作用有限,只能在习惯养成前,做些格式上的调整和重复性的调整工作,调整幅度较小,不能帮你增添代码,或去掉代码,如果习惯已经养成,代码风格已经不错了,因此总的来说还是得养成良好的编码习惯。好习惯养成方法制定和记录编码规则,习惯是长时间频繁执行养成的,

2020-05-16 14:48:30 264

原创 Linux 可执行程序的分段结构

说明Linux系统下编译产生的二进制程序是以ELF格式存储的,ELF格式是分段的;由于Linux系统采用段式内存管理架构,二进制程序加载进内存后内存也是分段的。windows系统也是类似的。个人理解分段是由编译器和操作系统实现,编译时编译器将不同类型的元素存储到相应的段,以区分处理,利于管理和加快操作效率。分段行为不是固定的,不同编译器,不同平台可能有细微差别,虚拟内存和硬盘都是连续的。程序由数据和处理两部分组成,处理部分(代码)编译后为二进制指令(代码段)比较固定,而数据部分(变量)有多

2020-05-15 19:41:57 1464

原创 基础语法 - 友元

说明为了实现数据的隐藏,时常将数据设置为类的私有成员,但是私有成员只能在类内部访问,如果想在别处访问对象的私有成员,只能通过类提供的public接口间接地访问;这固然能够带来数据隐藏的好处,但也会增加代码书写的麻烦。友元的作用就是 将函数或类设置成某个类的友元,并且能够访问该类的所有成员包括私有成员和受保护成员,以解决上面提到的问题。编程时为了方便访问,有时会将类的私有数据设置成 public,这破坏了数据的隐藏性,是个不好的编程习惯。与java比较java不支持友元,思想是:私有成员不能直

2020-05-13 21:24:13 260

原创 基础语法 - 命名空间和作用域标识符

命名空间简介命名空间是由用户定义命名的作用域空间,常用来处理同名冲突以及其它问题,例如:某个代码文件中定义了一个函数,可能在别的文件中有同名的函数,链接时就会出错,可以加上static来限制,但是如果别的文件中需要使用到函数就不好控制了。为了避免命名冲突,实现一个库时一般会给函数名手动加上库名,因为担心别的文件中也定义了同样的函数名,如果使用命名空间就方便很多。命名空间作用:将代码分类封装和隔离。实现原理:编译时编译器会自动给命名空间中的函数和变量加上空间名处理后的特殊字符。使用

2020-05-12 19:34:33 676

原创 用户管理

说明不同于windows系统,Linux和其他类UNIX系统是多用户、多任务的操作系统。多用户允许多人在Linux中创建独立的账户来确保个人数据的安全性;而多任务允许多个用户同时登陆,同时使用系统的软硬件资源。不能直接使用root用户,权限太大,容易误删文件,造成系统出问题。用户管理用户管理分为:用户管理和用户组管理。root用户有完整权限,也可以将部分权限赋予给其它用户。用户管理查看所有用户和用户信息cat /etc/passwd每一行都是一个用户以及其用户信息新增用户

2020-05-08 21:19:01 313

原创 基础语法 - 代码复用

说明shell是脚本语言,单个文件为一个模块,但是命名空间未变。方法方法一: . ./subscript.sh #两个点之间有空格,千万要注意.方法二: source ./subscript.sh例子:main.sh #主脚本subscripts.sh #被调用脚本* subscripts.sh 脚本内容如下#!/bin/shstring="Hello,World! \n"* main.sh 脚本内容如下#!/bin/bash

2020-05-08 21:11:20 161

原创 编译工具 - GUN编译器 - 去掉未使用的函数

说明在公司做嵌入式产品开发时,需要想办法减少系统资源占用,由于以下原因,想去掉未使用的函数。嵌入式设备资源非常不足,当时只有128M内存,flash只有16M,并且公司要求资源减半,做costdown产品。公司员工经验不足,编码习惯不好,以及考虑扩展,定义了很多空函数和未使用的函数。链接的库,为了通用,写的比较完善,有很多接口,但是很多只使用到了部分接口。优化尝试库经过学习以及测试验证得到结论:静态库链接时只会将使用到的中间文件链接进程序,不会链接所有文件,因此库文件大小不重要

2020-05-08 21:01:20 994

原创 基础语法 - 空指针

引子早期c++编程中定义空指针我们会使用NULL,如下:int *p = NULL;但是在函数重载时会出问题的,示例代码如下:#include <iostream>#include <string>using namespace std;void func(int* num){ cout << "this is the ptr function..." << endl;}void func(int num){

2020-05-08 20:38:13 175

原创 面向对象 - 继承控制final和重写控制override

说明从C++11开始支持override和final关键词。finalfinal的英文意思是:adj.最终的;最后的;(指结果)最终的;决定性的;不可改变的在C++作用类似,可以修饰类,结构体和函数,修饰类和结构体表示禁止继承该类,对于函数表示禁止重写该函数。final 类将类标记为final,继承该类会导致编译错误。class A final { //......

2020-05-07 20:44:55 122

原创 基础语法 - 基础数据类型 - 字符串

说明字符串是基本数据类型,使用时不需要导入什么包。go的字符串是不可变的,要改变只能重新生成一个新的字符串。声明&定义var a string = “hello”var b := "world!"常用操作求长度len(a)取字符操作和数组一样。a[index] 字符串拼接普通拼接c := a + b由于字符串是不可变的,普通拼接会导致构造...

2020-05-07 19:50:14 136

原创 调试工具 - adb

说明adb是Android Debug Bridge(安卓调试桥) tools,是一个命令行工具,用于对通过USB与电脑连接的安卓设备进行调试。不仅仅是安卓设备,在嵌入式开发中,很多Linux设备当前也支持adb调试工具,例如:MTK平台。架构ADB是一个C/S架构的应用程序,由三部分组成:运行在pc端的adb client:命令行程序”adb”用于从shell或脚本中运...

2020-05-07 19:30:49 415

原创 基础语法 - 包(package)

说明包是代码包装成模块的方式,不同于python(每个模块就是一个文件),go的包是以目录的形式,一个目录是一个模块,包内文件是以源码的形式存在。包也是实现代码复用的一种方式,同时每个包也是一个独立命名空间,从而避免了命名冲突的问题。定义包定义如下:package name //package + 包名package A/b //错误,包是按单个目录管理的,不需要定义层次关系...

2020-05-07 19:27:55 644

原创 编译原理 - 变量的内存地址和符号地址

变量地址引子访问局部变量时,程序如何知道变量的内存地址?如下:int a;a = 10;理解保存在data,rodata等分区的变量,内存地址在编译期就能确定,通过变量名的访问可以由在编译期将变量名映射为变量的内存地址来实现;但是局部变量和指针变量不同,其内存地址是不断变化的,每次执行都不同。事实上所有的变量的地址都是在编译阶段确定下来了的,包括局部变量和指针变量本身,编译期...

2020-05-05 20:33:05 5636 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除