- 博客(36)
- 资源 (1)
- 收藏
- 关注
原创 C++中计算程序的运行时间
在我们实际开发中,尤其对于算法工程师来说,有时候为了比较不同的算法或者优化算法,需要计算各个算法运行的时间或者关键代码段的运行时间,以此来衡量算法在速度上的优劣或者进行代码优化时的一个参考。因此对于程序员来说,如何计算程序的运行时间就是一个需要解决的基本问题了。对于C++来说,在C++11之前并没有与时间相关的直接的标准库,基本上是使用C语言中对时间进行处理的相关功能,或者直接使用和平台相关的系...
2018-09-29 19:19:12 15894 5
原创 重新认识三目运算符 -- ? :
三目运算符即条件表达式运算符:? :,其基本形式如下:logical-OR expression ? expression : conditional-expression大家都知道该运算符的作用,当?前面的条件为真时,就执行:前面的表达式,如果条件为假时,则执行:后面的表达式,并返回相应的计算结果。但是在使用过程中,一直忽略了一个东西,那就是条件表达式运算符的返回结果的类型是什么?可...
2018-09-29 11:55:30 1412
原创 const关键字修饰左值引用的2个作用
const 在函数形参中的作用首先看下面的例子:#include <string>#include <iostream>void printStringL(std::string &str) { std::cout << str <&am
2018-09-28 18:10:32 1387 1
原创 可调用对象(Callable Object)
在 C++11 中经常提及 Callable object ,即所谓的可调用对象,这里就总结一下常见的可调用对象都有哪些。常见的可调用对象:functionmember functionfunction objectlambda expressionbind expression...
2018-09-20 16:42:50 2492
原创 理解右值和右值引用
基本概念lvalue 永久对象,可取地址,可以出现在 operator= 左侧。 典型的 lvalue:有名称的变量等。rvalue 临时对象(即将销毁),不可取地址,只能出现在 operator= 右侧(标准库中有例外,如string、complex 等)。 典型的 rvalue:字面常量(如1、2…等)、匿名对象(临时对象)等。一个表达式的值要么是 lvalue,要么是 r...
2018-09-17 16:58:04 9273
原创 野指针 和 悬空指针(引用)
野指针:未初始化的指针,其指针内容为一个垃圾数。 悬空指针:指针正常初始化,曾指向过一个正常的对象,但是对象销毁了,该指针未置空,就成了悬空指针。int main() { int *p; // 指针未初始化,此时 p 为野指针 int *pi = nullptr; { int i = 6; pi = &i; // 此时 pi...
2018-09-13 17:25:53 3321
原创 Ubuntu 18.04 下安装 GDAL 开发环境
通过 apt-get 安装$ sudo apt-get install libgdal-dev执行上面的命令,用于安装 GDAL 的开发环境可通过 $ gdal-config 命令来查看 GDAL 的相关配置 头文件路径默认安装在:/usr/include/gdal 共享库及静态库默认安装在:/usr/lib 库名字:libgdal.a 和 libgdal.so$ sudo...
2018-09-08 22:46:33 12119 1
原创 C中的运算符优先级和结合性(*p++)
优先级和结合性优先级是用来标识运算符在表达式中的运算顺序的,在求解表达式的值的时候,总是先按运算符的优先次序由高到低进行操作。但是,当一个运算对象两侧的运算符的优先级别相同时,则按运算符的结合性来确定表达式的运算顺序。结合性是指同一优先级的运算符在表达式中操作的组织方向,即:当一个运算对象两侧的运算符的优先级别相同时,运算对象与运算符的结合顺序。最容易搞混的莫过于运算符优先级处于第二级...
2018-08-14 16:17:27 6364 2
原创 对C/C++中字符串的理解
C/C++ 中每个字符串都以字符 \0 作为结尾,以此作为字符串结束的标志。为了节省内存,C/C++ 把常量字符串放到单独的一个区域(一般放置在.rodata 中)。当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的内存地址,因为在内存中,只存在一份相同的字符串常量。 .rodata 区域一般用来放置只读数据,如常量字符串,const 修饰的变量等(也有的编译器将常量字符串放在...
2018-08-14 11:56:35 268
原创 记录一道C++面试题 -- 构造函数中调用虚函数
题目:以下程序运行的结果是什么?class A {public: A() { std::cout << "create A" << std::endl; virFunc(); } virtual void virFunc() { std::cout &am
2018-08-11 10:06:37 407
原创 STL 六大组件概要
数据结构与算法STL容器(containers)算法(algorithms)迭代器(iterators)配置器(allocators)仿函数(functors)配接器或适配器(adapters)数据结构与算法相信大家都听过一句话:程序 = 数据结构 + 算法。 我们在写程序时,实际上就是在对给定的数据进行一系列的操作,然后将处理的结果返回给需要接收的地...
2018-08-07 19:18:50 290
原创 通过内置数组初始化 vector 容器
template< class InputIt >vector( InputIt first, InputIt last, const Allocator& alloc = Allocator() );上面的构造函数的原型属于 vector 的 range constructor: Constructs the container with the c...
2018-08-03 17:27:48 544
原创 C/C++中的字节对齐
// Data Aligment // Data stored in memory must be "aliged" according to // the length of the data.//// Byte Data// can go at any address// Halfword Data// must be "halfword aligned"...
2018-08-02 16:39:09 264
原创 侯捷C++大系 -- C++面向对象高级编程(上)
如何设计一个 class ?本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 ...
2018-08-02 16:24:12 2101
原创 Unix文件系统基本概述
1. Unix系统内核框架Unix内核基本上是按模块进行设计的,比如文件子系统,进程控制子系统等等,各个子系统相对比较独立,但在有必要的时候又可以进行彼此的沟通交流。下图就说明了早期Unix的系统内核框架。 2. 文件子系统概要什么是文件系统?文件系统是一个逻辑(看不见,摸不着)上的概念,而磁盘是一个物理(真实存在,看得见,摸得着)上的概念。一套系统装置可以有若干个物理磁盘设备,...
2018-05-13 20:07:14 9933 2
原创 UTD/GMT & 本地时间
UTC和GMT协调世界时(Coordinated Universal Time,UTC)和格林尼治时间(Greenwich Mean Time,GMT)基本指的是一个时间,相当于是全世界的一个标准时间。全球被分为24个时区,伦敦处于0时区,以0时区为中心,向西(时间慢)减相应的时区即为西边国家的本地时间,向东(时间快)加相应的时区即为东边国家的本地时间。我们国家以北京时间为标准,而北京...
2018-05-11 23:04:32 3076
原创 (32位汇编 七)堆栈/栈(stack)
PUSH指令操作码操作数PUSHr32PUSHr16PUSHm16PUSHm32PUSHimm8/imm16/imm32POP指令操作码操作数POPr32POPr16POPm16POPm32PUSHAD指令 保护现场POPAD指令 恢复现场
2017-10-13 16:04:00 1333
原创 (32位汇编 十一)修改EIP的值
JMP指令无条件跳转。修改EIP的值,而且只影响EIP的值。MOV EIP, 寄存器/立即数 ;不能执行简写为:JMP 寄存器/立即数CALL和RET指令执行call前CALL指令PUSH 地址BMOV EIP, 地址A/寄存器简写为:CALL 地址A/寄存器执行call后理解:调用call时,会首先把call当前指令的下一条指令地址压入栈中,相应的ESP寄存
2017-10-13 16:03:57 1910
原创 (32位汇编 九)ADC/SBB/XCHG/MOVS/STOS/REP
ADC指令带进位加法。格式:ADC R/M, R/M/IMM 两边不能同时为内存,宽度要一样ADC AL, CLADC BYTE PTR DS:[12FFC4], 2ADC BYTE PTR DS:[12FFC4], ALSBB指令带借位减法格式:SBB R/M, R/M/IMM 两边不能同时为内存,宽度要一样SBB AL, CLSBB BYTE PTR DS:[
2017-10-13 16:03:54 923
原创 (32位汇编 八)标志寄存器
EFLAGS寄存器1. 进位标志CF(Carry Flag)如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。MOV AL, 0xEFADD AL, 2MOV AL, 0xFEADD AL, 22. 奇偶标志PF(Parity Flag)奇偶标志PF用于反映运算结果中(最低有效字节中)1的个数的奇偶性。MOV AL, 3ADD AL, 3AD
2017-10-13 16:03:51 659
原创 (32位汇编 十)SI/DI/BP/SP/IP/CS/DS/ES/SS
DS is called data segment register. It points to the segment of the data used by the running program. You can point this to anywhere you want as long as it contains the desired data. ES is called extr
2017-10-13 16:03:48 917
原创 Intel处理器简介
8086所有的内部寄存器、内部及外部数据总线都是16位宽20位外部地址总线第一款16位微处理器实模式不支持多任务操作系统8086是Intel最成功的处理器x86架构的开端Intel 8086寄存器8028624位地址总线支持实模式(8086模式)和保护模式不支持虚拟8086模式支持多任务操作系统第一个使用CISC(复杂指令集计算机)的处理器。803863
2017-10-13 16:03:45 608
原创 (32位汇编 六)内存读写及寻址方式
我们称计算机CPU是32位或者64位,有很多书上说之所以叫32位计算机是因为寄存器的宽度是32位,这样说是不准确的,因为还有很多寄存器是大于32位的。多少位的机器和寄存器的宽度没有关系,和计算机的寻址宽度有关系,所能查找的内存编号的范围。内存格式每一个内存单元的宽度为8位。[编号]称为地址。内存单元:字节 每个字节有个编号,称为内存地址从指定的内存中写入/读取数据mov
2017-10-13 16:03:42 4142 2
原创 (32位汇编 五)mov/add/sub/and/or/xor/not
说明符号说明r通用寄存器m代表内存imm代表立即数r8代表8位通用寄存器m8代表8位内存imm8代表8位立即数一、MOV语法操作码目标操作数源操作数MOVr/m8r8MOVr/m16r16MOVr/m32r32MOVr8r/m8MOVr16r/m16M
2017-10-13 16:03:39 1329
原创 (32位汇编 四)32位通用寄存器
一、32位通用寄存器寄存器编号存储数据的范围EAX00 - 0xFFFFFFFFECX10 - 0xFFFFFFFFEDX20 - 0xFFFFFFFFEBX30 - 0xFFFFFFFFESP40 - 0xFFFFFFFFEBP50 - 0xFFFFFFFFESI60 - 0xFFFFFFFFEDI7
2017-10-13 16:03:36 2606
原创 (32位汇编 三)字
BYTE 8位WORD 16位注意:字长被定义为某个特定值是为了与早期的电脑保持兼容。DWORD 32位QWORD 64位DQWORD 128位
2017-10-13 16:03:33 280
原创 (32位汇编 二)二进制的逻辑运算
1. 或(or |)只要有一个为1,就为1。2. 与(and &)两个都为1,就为1。3. 异或(xor ^)两个不一样时,就为1。4. 非(not !)1是0,0是1。提示: CPU计算的本质就是逻辑运算逻辑运算的具体应用1. CPU如何计算2 + 3?图1 cpu如何实现2 + 32. 如何获取某个值的第n位的(二进制)值是多少?例如:如何获取0x8F的
2017-10-13 16:03:30 1649
原创 GDAL获取影像中心波长和单位
GDALDataset *gdalDataset = (GDALDataset*)GDALOpen("D:\\test.img", GA_ReadOnly);if (NULL == InputFile){ // TODO} for (int iband = 1; iband < bandsize+1; iband++){ const char *wave = gd
2017-10-13 16:03:25 1207
原创 void和void *
一、voidvoid的意思是“无类型”,相对于void *来说,使用的时候比较简单,一般只在两个地方使用:当函数没有返回值时,在声明和定义函数的时候,需要使用void,例如:// 交换两个整数,要求传入两个整数的地址,此时就不需要返回值了void swap(int *ap, int *bp){ int temp = *ap; *ap = *bp; *bp =
2017-10-13 16:03:22 1370
原创 C/C++中的整数和浮点数在计算机中是如何表示的?
一、整数在计算机中的表示在C/C++中,整数一般分为无符号数(unsigned char、unsigned short、unsigned int等)和有符号数(char、short、int、long等),在计算机中通过补码来表示,那么有童鞋会问了,不是有那什么原码、反码之类的吗?为什么不用它们而偏偏用补码呢?一开始我也有这样的困惑,于是通过各种查,各种看,算是理解了一点点,这里不打算详细解释原
2017-10-13 16:03:19 3983
原创 对8086中的段的理解
8086内部结构在8086CPU中,主要由总线接口部件(BIU)和执行部件(EU)组成。总线接口部件(BIU)负责与存储器、外部设备之间进行信息交换;执行部件(EU)负责指令的执行。我们知道,8086是16位的CPU,内部的寄存器之间,寄存器和运算器之间的数据交换一次最多只能传输16位,而8086的外部地址总线却有20位,也就是说,8086可以寻找的内存单元范围是0-0xFFFFF。
2017-09-26 20:07:37 1420 2
原创 windows下使用Armadillo+openBLAS
最近做图像处理相关的工作,涉及到图像数据的协方差矩阵及其逆矩阵的求解,比如在PCA算法以及RXD异常检测算法中都需要求解协方差矩阵;虽然可以自己基于指针的方法求解,但是对于数据较大时,效率很难保证(也许是笔者能力有限吧),但是在求逆矩阵时还是得需要用到其它库(当然大牛也可以自己写),所以就在网上查找了相关第三方开源矩阵库;总体来说,比较推荐的库有Armadillo,Eigen等,其中,Armadi
2016-08-19 21:09:38 6233 3
转载 C++ 中获取EXE路径
一、1.只获得路径字串不包含文件名TCHAR szFilePath[MAX_PATH + 1]={0};GetModuleFileName(NULL, szFilePath, MAX_PATH);(_tcsrchr(szFilePath, _T('\\')))[1] = 0; // 删除文件名,只获得路径字串CString str_url = szFilePath; // 例
2016-07-30 20:21:56 2136
原创 TVDI中线性拟合干湿边的步骤
在之前的最小二乘法拟合直线-C++实现文章中有提过TVDI指数计算的方法,其中拟合的关键是怎么找到有效的NDVI(相当于自变量X)和LST(相当于因变量Y)这两组相对应的数据,即具体干湿边拟合的步骤是怎么样的。本文针对干湿边的拟合过程做一个详细的说明,如有不足之处恳请各位指教。首先需要说明的一点是输入的NDVI和LST数据是行列数相等的数据,因此,可以以NDVI为横坐标,LST为纵坐标,得到N
2016-07-17 21:38:07 9154
原创 最小二乘法拟合直线-C++实现
最近公司的一个项目需要计算TVDI(Temperature Vegetation Dryness Index ,温度植被干旱指数) ,TVDI的计算公式如下(具体原理自行百度):其中,为任意像元的地表温度;为某一NDVI对应的最小地表温度,对应的是湿边;为某一NDVI对应的最大地表温度,对应的是干边;a,b为湿边的拟合方程系数,c,d为干边的拟合方程系数。在拟合干边和湿边的过程
2016-07-16 22:42:57 27165 6
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人