C++
文章平均质量分 61
wuguinianjing
这个作者很懒,什么都没留下…
展开
-
linux线程
1 线程的概念:进程内部的一条执行序列(执行流,有序指令的集合),一个进程可以包含多条线程,至少有一条线程,就是main方法所代表的这条执行流- -主线程。进程中的线程仅仅是有一个独自的栈区空间(区别于栈帧)(包含了线程执行的数据)线程管理的提出前,OS一直以进程作为独立运行的基本单位为什么使用线程?(性能问题) 提出一种新的实体,线程1.满足实体之间可以并发的执行(与进程类似)2.实体之间共享相同的地址空间和相同的资源(与进程不同,进程的地址空间相对是独立的,若A进程要访问B进程的地址空间需原创 2020-11-07 01:20:56 · 231 阅读 · 0 评论 -
effective C++思想总结
条款2 尽量以const,enum,inline 替换#definemocro 没有符号,可能不会进入system table,常量有符号const 变量命名,以"kxxx"开头,大小写混合类内的专属常量至多只有一份实体,你必须保证让它成为一个static成员,将定义实现到实现文件而非头文件define不会被作用域限制,一旦被定义,它就在其后的编译过程中有效(除非在某处被#undef),即不能提供任何封装性,const可被封装,const能有作用域影响,类private,extern等编译阶段只原创 2021-12-02 19:02:36 · 179 阅读 · 0 评论 -
内存管理、内存池
内存池原创 2021-11-28 17:05:10 · 156 阅读 · 0 评论 -
库版本管理
由于so-name无法处理次版本号的版本交汇问题,需要引入一种新的机制来进行区分次版本—符号的版本控制机制基于符号的版本控制机制正常情况下,为了表示某个共享库中增加了一些接口,我们就把这个共享库的次版本号升高(表示里面添加了一些东西)。但是我们需要一种更为巧妙的方法,来解决次版本号交会问题。Linux 下的Glibc 从版本2.1之后开始支持一种叫做基于符合的版本机制。这个方案的基本思路是让每个导出和导入的符号都有一个相关联的版本号,它的实际做法类似于名称修饰的方法...原创 2021-11-25 15:54:47 · 131 阅读 · 0 评论 -
标准库的归总
迭代器value type 迭代器所指对象的类型,Iterator_traits能根据容器的迭代器,萃取出元素类型value typedifference type 表示两个迭代器之间的距离,也可以用来表示容器的最大容量,例如count()计数功能,其传回值就必须使用迭代器的difference typereference type常引用普通引用pointer type...原创 2021-11-11 00:38:26 · 883 阅读 · 0 评论 -
tupe 元组
简介tuple元组是一个固定大小的不同类型值的集合,是泛化的std::pair。和C#中的tuple类似,但是比C#中的 tuple强大得多。我们也可以把它当作一个通用的结构体来用,不需要创建结构体又获取结构体的特征,在某些情况下可以取代结构体,使程序更简洁、直观。tuple看似简单,其实它是简约而不简单,可以说它是C++11中一个既简单又复杂的类型,简单的一面是它很容易使用,复杂的一面是它内部隐藏了太多细节,往往要和模板元的一些技巧结合起来使用。下面看看tuple的基本用法。构建tuple原创 2021-11-10 21:53:27 · 712 阅读 · 0 评论 -
将文件间的编译依存关系降至最低
对于头文件利用声明的依存性替代定义的依存性定义的依存性编译器对其定义时根据类型推算出该对象大小#include"Person"int x;Person person;声明的依存性使用指针来延迟编译器对其所指类型的推演,编译器不知道指针会指向何处,推迟到运行时动态分配。前置声明的person不能去直接调用Person,前置声明是没有对象大小的,也不能以此去进行类型转换。类型转换同样需要提前知道类型大小函数的形参和返回值是可以前置声明的//不引入包含Person的头文件,而使用前置声明.原创 2021-11-08 13:24:17 · 80 阅读 · 0 评论 -
里氏代换原则和C11类型转换
里氏代换原则:里氏代换原则是面向对象设计的基本原则之一。即任何基类可以出现的地方,子类一定可以出现。里氏代换原则是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受影响时,基类才能被真正复用,而衍生类也能够在积累的基础上增加新的行为,里氏代换原则是对·开-闭"原则的补充。实现开-闭"原则的关键步骤就是抽象化。在基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。当满足继承的时候,父类肯定存在非私有的成员,子类肯定是得到了父类的这些非私有成员(假原创 2021-11-06 16:46:18 · 139 阅读 · 0 评论 -
运行时加载动态库
一个程序从源文件编译生成可执行文件的步骤:预编译 --> 编译 --> 汇编 --> 链接(1)预编译,即预处理,主要处理在源代码文件中以“#”开始的预编译指令,如宏展开、处理条件编译指令、处理#include指令等。(2)编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析以及优化后生成相应的汇编代码文件。(3)汇编是将汇编代码转变成二进制文件。(4)链接将二进制文件链接成一个可执行的命令,主要是把分散的数据和代码收集并合成一个单一的可加载并可执行的的文件。原创 2021-11-02 00:36:17 · 1864 阅读 · 0 评论 -
右值引用和完美转发,浅拷贝,深拷贝,移动
右值引用右值引用为什么重要呢,其是STL标准库效率提升的利器折叠引用原创 2021-10-29 00:02:19 · 369 阅读 · 0 评论 -
C++术语
声明式定义式初始化原创 2021-10-16 15:32:04 · 198 阅读 · 0 评论 -
C++11可变参数模板
简介C++11增强了模板功能,在C++11之前,类模板和函数模板只能含有固定数量的模板参数,现在C++11中的新特性可变参数模板允许模板定义中包含0到任意个模板参数。可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号“…”。参数表省略号的作用有两个:声明一个参数包,这个参数包可以包含0到任意个模板参数。在模板定义的右边,可以将参数包展开成一个个独立的参数。解析参数包如果需要用参数包中的参数,则一定要将参数包展原创 2021-10-15 17:07:42 · 134 阅读 · 0 评论 -
sqlite学习归总
简介SQLite3只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比Mysql还快,专门用于移动设备上进行适量的数据存取,它只是一个文件,不需要服务器进程。SQL语句是SQL操作的指令,我们用C/C++访问数据库时,需要用char*即C字符串来保存SQL语句,然后调用相应sqlite3库的函数,传入C字符串,来执行SQL指令。常用术语:表(table)、字段(column,列,属性)、记录(row,record)。SQL(structured query language)语句特点:原创 2021-10-14 23:19:36 · 219 阅读 · 0 评论 -
C++11 enable_if
enable_if 的主要作用就是当某个 condition 成立时,enable_if可以提供某种类型.其作为选择类型的小工具,其广泛的应用在 C++ 的模板元编程(meta programming)中。它的定义也异常的简单:template <bool, typename T=void>struct enable_if {}; template <typename T>struct enable_if<true, T> { using type .原创 2021-10-14 00:41:12 · 316 阅读 · 0 评论 -
模板学习归总
SFINAESFINAE(Substitution Failure Is Not An Error) 是C++ 的一种语言属性,具体内容就是”从一组重载函数中删除模板实例化无效的函数”。SFINAE 应用最为广泛的场景是C++中的 std::enable_if,这里有完整的英文描述:In the process of template argument deduction, a C++ compiler attempts to instantiate signatures of a numbe原创 2021-10-14 00:39:09 · 129 阅读 · 0 评论 -
C++中boolalpha的用法
1.头文件#include 2.使用说明让输出流将bool解析成为true或者 false。3、示例代码void test_boolalpha(){ std::cout << "true is " << true << std::endl; std::cout << "false is " << false << std::endl; // 运行下面这个语句, 在输出流中的bool值将发生变化 std::cout转载 2021-10-14 00:35:26 · 1841 阅读 · 0 评论 -
C++11 std::is_same和std::decay
C++11的模板类型判断——std::is_same和std::decay问题提出:有一个模板函数,函数在处理int型和double型时需要进行特殊的处理,那么怎么在编译期知道传入的参数的数据类型是int型还是double型呢?#include <iostream>template<typename TYPE>void typeCheck(TYPE data){ //do something check data type //std::cout<&转载 2021-10-13 23:53:35 · 287 阅读 · 0 评论 -
rapidjson的简单使用
Write/*{"Int": 1,"Double": 12.0000001,"String": "This is a string","Object": {"name": "qq849635649","age": 25},"IntArray": [10,20,30],"DoubleArray": [1,2,3],"StringArray": ["one","two","three"],"MixedArray": ["one",50,false,12.原创 2021-10-13 15:47:35 · 1091 阅读 · 0 评论 -
rapidxml的简单使用
Write#include <iostream>#include <string>#include <fstream>#include "rapidxml.hpp"#include "rapidxml_print.hpp"/*xmlDocumnetDeclaration---NodeElement---NodeComment; //注释 ---NodeAttribute; //属性 Text; //内容//层级收rap原创 2021-10-13 15:39:06 · 720 阅读 · 0 评论 -
序列化和反序列化
1. 什么是序列化?程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯。这个将 程序数据转化成能被存储并传输的格式的过程被称为“序列化”(Serialization),而它的逆过程则可被称为“反序列化” (Deserialization)。简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它根据流重构对象。这两个过程结合起来,可以轻 松地存储和传输数据。例如,可以序列化一个对象,然转载 2021-09-22 16:21:20 · 106 阅读 · 0 评论 -
STL记录
错误处理和异常处理C++标准程序库由不同的成分构成,来源不同,设计与实现风格迥异。而错误处理和异常正是这种差异的一个典型体现。例如string classes,支持具体的错误异常,它检查所有可能发生的错误,并于错误发生时抛出异常。其他的STL和valarrays,效率重于安全,因此几乎不检验逻辑错误,并且只在执行期发生错误时才抛出异常。标准异常类别语言本身或标准程序库所抛出的所有异常,都派生自基类execption,它们构成了一个类体系。异常的成员函数namespace std{原创 2021-09-09 15:32:25 · 70 阅读 · 0 评论 -
C++与C的相互调用
C++调用C语言extern “C”C++调用C,指定部分按照c语言进行编译extern “C” {} 只能由C++编译器来进行解析extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。原创 2021-03-28 16:03:13 · 1040 阅读 · 0 评论 -
C++多线程
接收线程的返回值//1、使用引用或指针 但多层函数调用时,需要注意其引用对象或取地址的空间被回收,生命期//所以一般不用轻易使用栈内的临时对象作为参数传给另外的线程,使用堆//2、使用智能指针--》堆#include<iostream>#include<mutex>#include<thread>#include <semaphore>using namespace std;void Func(int x,int y,int *ans)原创 2021-01-24 01:14:16 · 86 阅读 · 0 评论 -
裸指针、智能指针、垃圾收集器
裸指针存在的问题:1.难以区分指向是单个对象还是一个数组2.使用完指针之后无法判断是否应该销毁指针,因为无法判断指针是否拥有指向的对象。3.在已经确定需要销毁指针的情况下,也无法确定是delete关键字删除,还是有其他特殊的销毁机制,例如通过指针传入某个特定的销毁函数来销毁指针4.即使已经确定了销毁指针的方法,由于1的原因,仍然无法确定到达是用delete,还是用delete[]5.假设上述的问题都解决了,也很难保证在代码的所有路径中(分支结构,异常导致的跳转),有且仅有一次销毁指针操作;任何一条原创 2020-12-20 10:21:47 · 519 阅读 · 1 评论 -
auto_ptr 被弃用的原因
auto_ptr采用copy语义来转移指针资源,转移指针资源的所有权的同时将原指针置为NULL,这跟通常理解的copy行为是不一致的(不会修改原数据),而这样的行为在有些场合下不是我们希望看到的。例如参考《Effective STL》第8条,sort的快排实现中有将元素复制到某个局部临时对象中,但对于auto_ptr,却将原元素置为null,这就导致最后的排序结果中可能有大量的null。而现在C++11的对move语义的支持,使得这样的资源转移通常只会在必要的场合发生,例如转移一个临时变量(右值)给某个n原创 2020-12-06 18:26:37 · 2967 阅读 · 0 评论 -
类型的归总
类型sizeof 计算变量或数据类型所占的字节个数在32 位的系统上short 占据的内存大小是2 个byte;int 占据的内存大小是4 个byte;long 占据的内存大小是4 个byte;float 占据的内存大小是4 个byte;double 占据的内存大小是8 个byte;char 占据的内存大小是1 个byte。bool 占据的内存大小是1 个byte。void 不能定义变量,但可以定义指针常见的ASICII值'a' // 97'A' // 65'\0' //原创 2020-11-19 16:25:51 · 272 阅读 · 0 评论 -
编译器的工作
编译器的编译顺序?编译器从上到下顺序扫描程序。sizeof() 编译时计算出来 ++运行时才进行原创 2020-11-14 22:03:00 · 125 阅读 · 0 评论 -
C++explicit关键字(构造函数的显式和隐式的区别)
首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:class CxString // 没有使用explicit关键字的类声明, 即默认为隐式声明 { public: char *_pstr; int _size转载 2020-11-11 16:29:39 · 1398 阅读 · 0 评论 -
值传递、地址传递、引用传递
值传递:值传递使得实参与形参没有联系,函数与函数之间没有耦合性,在各自的函数里修改值不会改变各自本身的值。但这也是它的缺陷。1.实参传入被调函数无法交换数值。2.当传入值大于8字节即需要进行整体拷贝,无论是开辟的空间还是数据的拷贝都相对较大(这也是设计数组退化为指针的原因),而指针传递只有4个字节所以需要地址传递来进行传参。地址传递地址的传递,使得传入的参数是地址,而*解引用去操作该地址的内存,使得在被调函数中也可以修改主调函数中的实参值(这也是其不好的一点,看你怎么利用)。但其传参后还需要进原创 2020-11-09 01:37:41 · 868 阅读 · 0 评论 -
常用头文件的函数
1 printf1.printf() //其是一个函数,也存在调用关系等 2 assertassert(条件判断) //<assert.h>//断言函数,在DEBUG编译后的obj文件中加入调试信息,release被忽略。如果条件判断不满足则打印导致不满足条件的原因和行数,返回值为空(void)3.itoaitoa(int value,char *string,int base) //广泛使用的非标准C语言和C++语言扩展功能,因此不能好好的被所有编译器使用//<原创 2020-11-07 01:13:09 · 1456 阅读 · 0 评论 -
mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。我们知道,被const关键字修饰的函数的一个重要作用就是为了能够保护类中的成员变量。即:该函数可以使用类中的所有成员变量,但是不能修改他们的值。然而,在某些特殊情况下,我们还是需要在const函数中修改类的某些成员变量,因为要修改的成员变量与类本身并无多少关系,即使转载 2020-11-04 01:47:22 · 146 阅读 · 0 评论 -
C++字符串类
class String{private: char * str;public: //String() //{ // str = NULL; //};//无参的构造函数 String(const char * p = NULL)//带参的构造函数,需要自己定义默认构造函数 { if (p == NULL) { str = new char[1];//对象里的指针指向了开辟的堆 *str = '\0'; } else { int n = strle原创 2020-10-31 00:51:29 · 61 阅读 · 0 评论 -
C++归总学习
1 类与对象封装是面向对象程序设计最基本的特性,把数据(属性)和函数(操作)合成一个整体,这在计算机世界中是用类与对象实现的。现实世界中的实体可以抽象出类别的概念。对应于计算机世界就有一个类(class)的概念,因为类是一个抽象的概念的对应体,所以计算机不给它分配内存,只给对象分配内存。class CGoods{ public : char Name[21] ; //对于中文可用wchar_t name[11] int Amount ; float Pric原创 2020-10-19 17:57:05 · 486 阅读 · 0 评论