C++11之array数组基础学习
[TOC]
概述文章参考:https://zhuanlan.zhihu.com/p/138210501
**左值(lvalue, left value)**,顾名思义就是赋值符号左边的值。准确来说, 左值是表达式(不一定是赋值表达式)后依然存在的持久对象。
**右值(rvalue, right value)**,右边的值,是指表达式结束后就不再存在的临时对象。
区分左值和右值是很重要的,这是使用C++11 move语义的基础。c++11标准基本上是通过举例来说明一个表达式是否是一个lvalue还是rvalue的。
1lvalue = rvalue;
对于以上的语句,lvalue是我们要赋值的对象。表示了一个占据内存中某个可识别的位置(也就是一个地址)的对象。它是一个变量,存在于内存中,它的值可以被改变,可以被取地址。任何可以通过它的名字,指针或者引用来接触的变量都是lvalue,例如定义的某个变量和函数的参数, 对一个表达式取地址。
rvalue则是一个临时变量,不存在于内存中,存在于CPU的寄存器或者指令的立即数中(immediate number),因此我们不能改变它的值,不能取 ...
C++11之array数组基础学习
[TOC]
概述hpp,Header plus plus的缩写,实质是将.cpp的实现代码混入.h头文件,即声明与定义(实现)都包含在同一个文件中。
该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译。
实现代码将直接编译到调用者的obj文件中,不再生成单独的obj。
采用hpp将大幅度减小project中的cpp文件数与编译次数,也不再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。
C++11之array数组基础学习
[TOC]
概述void的基本解释void的字面意思是“无类型”,void* 则为“无类型指针”,void *可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,定义一个void变量没有意义,不妨试着定义:
1void a;
这行语句编译时会出错,提示“illegal use of type ‘void’”。不过,即使void a的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:
(1) 对函数返回的限定;
(2) 对函数参数的限定。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:
123float *p1; int *p2; p1 = p2;
其中p1 = p2语句会编译出错,提示“’=’ : cannot convert from ‘int * ’ to ‘float *’”,必须改为:
1p1 = (float *)p2;
而void *则不同,任何类型的 ...
C++中可变参数原理及使用方法
[TOC]
文章参考:https://www.cnblogs.com/pengdonglin137/p/3345911.html
概述函数这章讲到了函数的变长参数(ellipsis…),但是primer中讲得比较浅,提到了怎么声明怎么调用,但是没有写明在函数内部是如何获取变长的参数的。
va_list是在C语言中解决变参问题的定义的一个类型,常在 va_start(), va_arg(), and va_end() 宏中使用。变参问题是指参数的个数不定,可以是传入一个参数也可以是多个。可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。
1)省略号(ellipsis)在无法给出所有传递给函数的参数的类型和数目时,可以使用省略号(…)指定函数参数表。有如下几种形式:
1231 void fun1(int a, double b, ...); //给出确定的几个参数,其他用省略号2 void fun2(int a ...); //省略号前有或者没有逗号都是可以的3 void fun3(...); ...
C++11之array数组基础学习
[TOC]
文章参考:https://blog.csdn.net/bzhxuexi/article/details/19899803
概述size_tsize_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。
size_t的真实类型与操作系统有关,在32位架构中被普遍定义为:
1typedef unsigned int size_t;
而在64位架构中被定义为:
1typedef unsigned long size_t;
size_t在32位架构上是4字节,在64位架构上是8字节,在不同架构上进行编译时需要注意这个问题。
而int在不同架构下都是4字节,与size_t不同;且int为带符号数,size_t为无符号数。
参考:size_t在WikiPedia上的词条
size_t是无符号的,并且是平台无关的,表示0-MAXINT的范围;
int是有符号的;
具体可参考:http://123.125.115.53/view/3236587.htm
ssize_tssize_t是有符号整型,在32位机器上等同与int,在64位机器上 ...
C++11之array数组基础学习
[TOC]
概述 C++11新标准引入了限定作用域的枚举类型(scoped enumeration)。定义限定作用域的枚举类型的一般形式是:首先是关键字enum class(或者等价地使用enum struct),随后是枚举类型名字以及用花括号括起来的以逗号分隔的枚举成员(enumerator)列表,最后是一个分号。
enum class 是C++11之后出来的新特性,enum 在这之后称为不限定范围的枚举,enum class称之为限定范围的枚举。就这范围的事情使用方式就大相径庭。
枚举作用域(enumeration scope)是指枚举类型的成员的名字的作用域,起自其声明之处,终止枚举定义结束之处。C语言规定,枚举类型的成员(enumerator)的可见范围被提升至该枚举类型所在的作用域内。这被认为有可能污染了外部的作用域,为此,C++11引入了枚举类(enum class)解决此问题。
enum和
C++11之array数组基础学习
[TOC]
概述隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。
但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表明存在什么风险,风险程度如何。再者,C风格的强制类型转换统一使用( ),而( )在代码中随处可见,所以也不利于使用文本检索工具(例如 Windows 下的 Ctrl+F、Linux 下的 grep 命令、Mac 下的 Command+F)定位关键代码。
为了使潜在风险更加细化,使问题追溯更加方便,使书写格式更加规范,C++ 对类型转换进行了分类,并新增了四个关键字来予以支持,它们分别是:
关键字
说明
static_cast
用于良性转换,一般不会导致意外发生,风险很低。
const_cast
用于 const 与非 const、volatile 与非 volatile 之间的转换。
reinterpret_cast
高度危险的转换,这种转换仅仅是对二进制位的重新解释,不会借助已有的转换规则对数据进行调整,但是可以实现最灵活的 C++ 类型转换。
dynami ...
16.C++中测量程序运行时间的方法汇总
[TOC]
文章参考:https://zhuanlan.zhihu.com/p/349949616
概述
Android之性能监控框架
[TOC]
文章参考:https://blog.csdn.net/qq_39583450/article/details/109715890
void* 是一种特殊的指针类型,可用于存放任意对象的地址。一个 void* 指针存放着一个地址,这一点和其他指针类似。
在介绍 void 指针前,简单说一下 void 关键字使用规则:
如果函数没有返回值,那么应声明为 void 类型;
如果函数无参数,那么应声明其参数为 void;(常省略)
如果函数的参数或返回值可以是任意类型指针,那么应声明其类型为 void* ;
void 的字面意思是“无类型”,void*则为“无类型指针”,void不能代表一个真实的变量,void体现了一种抽象。
任何类型的指针都可以直接赋值给void指针, 且无需进行强制类型转换。任何类型指针都可以直接赋值给void指针。
1234double obj = 3.14, *pd = &obj;void* pv = &obj; // 正确,void* 能存放任意类型对象的地址 // ...
C++多线程基础入门学习
[TOC]
概述文章参考:https://zhuanlan.zhihu.com/p/194198073
线程:线程是操作系统能够进行CPU调度的最小单位,它被包含在进程之中,一个进程可包含单个或者多个线程。可以用多个线程去完成一个任务,也可以用多个进程去完成一个任务,它们的本质都相当于多个人去合伙完成一件事。
多线程并发:多线程是实现并发(双核的真正并行或者单核机器的任务切换都叫并发)的一种手段,多线程并发即多个线程同时执行,一般而言,多线程并发就是把一个任务拆分为多个子任务,然后交由不同线程处理不同子任务,使得这多个子任务同时执行。
C++多线程并发: (简单情况下)实现C++多线程并发程序的思路如下:将任务的不同功能交由多个函数分别实现,创建多个线程,每个线程执行一个函数,一个任务就这样同时分由不同线程执行了。
不要过多纠结多线程与多进程、并发与并行这些概念 (这些概念都是相当于多个人去合伙完成一件事),会用才是王道,理解大致意思即可,想要深入了解可阅读本文“延伸拓展”章节。
我们通常在何时使用并发? 程序使用并发的原因有两种,为了关注点分离(程序中不同的功能,使用不同的线程去执行 ...