C++技术
文章平均质量分 63
拉普拉斯妖1228
这个作者很懒,什么都没留下…
展开
-
基于模板的类型擦除
基于模板的类型擦除,技术上来说,是编写一个类,它提供模板的构造函数和非虚函数接口提供功能;隐藏了对象的具体类型,但保留其行为。典型的就是std::function。原创 2023-12-12 19:33:54 · 151 阅读 · 0 评论 -
学懂现代C++——《Effective Modern C++》之转向现代C++
现代C++中像auto、智能指针、移动语义等都是一些重大的优化特性,但也有一些像constexpr、nullptr等等这样一个小的特性。这章的内容就是这些小特性的集合。原创 2023-09-27 17:03:41 · 112 阅读 · 0 评论 -
学懂现代C++——《Effective Modern C++》之类型推导和auto
本文主要对《Effective Modern C++》的前两章——类型推导和auto,做了知识点的总结。书中有更详细的推导和讲解过程,感兴趣的同学还是强烈建议大家去读原书。原创 2023-04-10 20:47:16 · 928 阅读 · 1 评论 -
Windows下编译和使用websocketpp
编译安装BoostWebSocketpp依赖于Boost,因此在使用WebSocketpp前需要编译安装Boost。到 Boost C++ Libraries - Browse /boost-binaries at SourceForge.net 下载稳定版的进行编译。下载的压缩包解压后进入Boost文件夹中,运行bootstrap.bat脚本。脚本运行完成后会生成b2.exe,运行b2.exe就会开始编译,编译时间会比较长。。。默认编译动态库,需要静态库的执行命令:b2 stage --too原创 2022-03-27 13:40:04 · 3191 阅读 · 0 评论 -
《More Effective C++》技术篇——Reference counting(引用计数)
Reference counting这项技术,允许多个等值对象共享同一实值。此技术的发展有两种动机,第一是为了简化heap object周边的簿记工作。它可以消除“记录对象拥有权”的负荷,因为当对象运用了reference counting技术,它便拥有它自己。一旦不再有任何人使用它,它便会自动销毁自己。reference counting的第二个发展动机则只是为了实现一种常识。如果许多对象有相同的值,将那个值存储多次是件愚蠢的事。最好是让所有等值对象共享一份实值就好。以下是一个包含了Copy-O..原创 2021-12-08 17:48:05 · 588 阅读 · 0 评论 -
《More Effective C++》技术篇——要求(或禁止)对象产生于heap之中
要求对象产生于heap中,意思是需要阻止clients不得使用new以外的方法产生对象。比较好的方法就是将destructor定义为private,因为constructor的类型太多,所以仍然将constructor定义为public。然后定义一个pseudo destructor来调用真正的destructor。示例如下:class HeapBasedObject {public: HeapBasedObject() {} void destroy() const { delet.原创 2021-10-31 17:44:50 · 123 阅读 · 0 评论 -
《More Effective C++》技术篇——限制某个class所能产生的对象数量
如下例,只要继承Counted template就可以限制class所能产生的对象数量,超过了设置的maxObjects就会抛出异常。#include <stdlib.h>#include <iostream>template<class BeingCounted>class Counted {public: class TooManyObjects{}; //这是可能被抛出的exceptions。 static int objectCou.原创 2021-10-24 16:11:32 · 93 阅读 · 0 评论 -
《More Effective C++》技术篇——将constructor和non-member function虚化
所谓virtual constructor是某种函数,视其获得的输入,可产生不同类型的对象。有一种特别的virtual constructor——所谓virtual copy constructor——也被广泛地运用、virtual copy constructor会返回一个指针,指向其调用者(某对象)的一个新副本。基于这种行为,virtual copy constructor通常以copyself或cloneself命令,或者直接命名为clone。当derived class重新定义其base cl.原创 2021-10-17 18:27:28 · 108 阅读 · 0 评论 -
Linux程序中集成breakpad
项目介绍breakpad是google开发的一个跨平台C/C++ dump捕获开源库,崩溃文件使用微软的minidump格式存储,也支持发送这个dump文件到服务器,breakpad可以在程序崩溃时触发dump写入操作,也可以在没有触发dump时主动写dump文件。breakpad支持windows、linux、macos、android、ios等。目前已有Google Chrome, Firefox, Google Picasa, Camino, Google Earth等项目使用。主页:https原创 2021-09-06 20:08:22 · 853 阅读 · 0 评论 -
C++11的condition_variable实现WaitForSingleObject功能
在多线程程序开发中,我们有时会希望等待其他线程结束后在继续执行某些任务。比如常见的,主线程需要等待其他所有子线程结束后再结束程序。在Windows下我们一般使用WaitForSingleObject,或者WaitForMultipleObjects来实现,它们都会等待Object被设置为有信号时才返回的。这样我们在主线程结束的地方wait,在子线程结束的地方设置信号,就能实现上述功能。但是这个API是Windows下的,无法跨平台使用。还好C++11为我们带来了多线程的支持。在C++11中我们可以通过m.原创 2021-04-24 16:22:38 · 868 阅读 · 0 评论 -
Linux命令行参数解析——getopt_long
在linux中,一切皆文件,所有的可执行程序都可以通过命令行启动,程序启动时通常都会带上各种参数以控制程序的行为。所以解析命令行参数通常是一个可执行程序的第一步,下面就来介绍下经常用到的命令行参数的解析函数——getopt_long。我们先来了解一下命令行参数。命令行参数可以分为两类,一类是短选项,一类是长选项。在命令行中"-“表示短选项,”–"则表示长选项。例如,在linux中最常用的ls命令中“-a,-A,-b”都是短选项,而它们对应的长选项则是“–all,–almost-all, --esc..原创 2021-04-18 10:15:23 · 293 阅读 · 0 评论 -
C++大厂面试真题
C++标准库的map和set有什么区别,如何实现的?map和set都是C++的关联容器,其底层实现都是红黑树。map和set区别在于:map中的元素是key-value(键-值)对:关键字起到索引的作用,值则表示与索引相关联的数据;set是关键字的简单集合,set中的元素都只包含一个关键字。set的迭代器是const的,不允许修改元素的值;map允许修改value,但不允许修改key。其原因是map和set是根据关键字排序来保证其有序性的,如果允许修改关键字的话,那么首先需要原创 2021-04-03 15:42:45 · 672 阅读 · 0 评论 -
《More Effective C++》总结笔记(三)
效率条款16:谨记80-20法则80-20法则说:一个程序80%的资源用于20%的代码身上。是的。80%的执行时间花在大约20%的代码身上,80%的内存被大约20%的代码使用,80%的磁盘访问动作由20%的代码执行,80%的维护力气花在20%的代码上面。不必拘泥于法则的数字,其基本重点是:软件的整体性能几乎总是由其构成要素(代码)的一小部分决定。从某个角度看,80-20法则暗示,大部分时候你所产出的代码,其性能坦白说是平凡的,因为80%的时间中,其效率不会影响系统整体性能。或许这不至于对你的自尊心原创 2021-03-07 14:20:52 · 194 阅读 · 0 评论 -
C++程序core dump分析
一、前言对于C/C++程序员而言,在开发程序的过程中,遇到的最多的程序问题莫过于程序core dump了,也就是常说的程序core了。那么程序出core的情况有哪些的?如果程序core了之后,我们应该如何对这类问题进行定位呢?本文给出了程序出core的常见原因和定位方法。二、 问题分类及定位方法为了给大家一个直观的认识,我们首先分析一下程序出core的常见原因及分类方法。通过这些分类,我们可以对分core的原因、定位方法有初步的认识。通常在程序出core之后,最常用的工具就是gdb,通过转载 2021-02-19 15:44:04 · 3307 阅读 · 0 评论 -
青蛙跳问题为什么是斐波那契数列
在面试中我们可能会遇到青蛙跳的问题:一只青蛙一次可以跳上一级台阶,或者跳上二级台阶。那么如果总共有N级台阶,问这只青蛙总共有多少种跳法?首先,我们考虑最简单的情况,如果只有一级台阶,那显然青蛙只有一种跳法。如果只有二级台阶,那么青蛙就有两种跳法,一种是每次跳一级,总共跳二次,另一种就是直接跳二级。接下来,再来看N级的(N大于2)的情况。我们先把N级台阶的跳法看做一个N的函数,记为f(N)。考虑N>2时,第一次跳就有两种跳法,一种是第一次只跳一级,此时跳法数就是后面剩下的N-1级台阶的跳..原创 2021-02-15 11:44:18 · 561 阅读 · 0 评论 -
《More Effective C++》总结笔记(二)——异常
异常条款9:利用destructors避免泄露资源只要坚持这个规则,把资源封装在对象内(类似智能指针shared_ptr),通常便可以在exceptions出现时避免泄露资源。简单来说就是,当有资源可能在函数抛异常时而无法释放,这时可以将资源封装到对象内(RAII),利用对象的析构函数来自动释放资源,这样即使有exceptions发生,也不会有资源泄露。条款10:在constructors内阻止资源泄露(resource leak)C++只会析构已构造完成的对象。对象只有在其construc原创 2021-02-05 16:40:06 · 110 阅读 · 0 评论 -
C++程序性能优化指南
原则《More Effective C++》书中效率部分第一条就是80—20准则。说得是——大约 20%的代码使用了 80%的程序资源;大约 20%的代码耗用了大约 80%的运行时间;大约 20%的代码使用了 80%的内存。因此,一些简单的优化也能显著提高程序性能。先完成程序功能,再考虑性能优化的事,否则会出现代码可读性差,过度抽象等问题。大部分的性能优化其实都是在做时间和空间的权衡,空间换时间,或者时间换空间。良好的代码风格和代码规范能有效的避免性能问题的出现,所以coderevi原创 2021-01-31 19:17:42 · 1034 阅读 · 4 评论 -
c++关键字typeid
typeid是c++的一个关键字,typeid操作符的返回结果是标准库类型type_info对象的引用。但是,C++标准并没有明确定义type_info,其具体实现依赖于各个编译器。标准只规定了typeid操作符必需实现如下四种操作:操作说明t1 == t2如果两个对象t1和t2类型相同,则返回true;否则返回falset1 != t2如果两个对象t1和t2类型不同,则返回true;否则返回falset.name()返回类型的C-style字符串。由编..原创 2021-01-15 17:36:36 · 485 阅读 · 0 评论 -
一文读懂C++内存对齐
操作系统64位和32位有什么区别?64位操作系统意味着其cpu拥有更大的寻址能力。理论上来说,其性能相比于32位操作系统会提升1倍。但是这也需要在64位操作系统上运行的软件也是64位的。软件中数据类型的的字节数大小其实和操作系统是多少位的没有关系,而是由编译器决定的。也就是说数据结构占多少位取决于在软件编译时我们选择的是64位还是32位的编译器。其具体占位数在编译器已经决定了。数据类型对应字节数下面是不同位数编译器下基本数据类型对应的字节数。32位编译器:char :1个字节char*原创 2021-01-10 21:21:52 · 245 阅读 · 0 评论 -
《More Effective C++》总结笔记(一)——基础议题、操作符
基础议题条款1:仔细区别pointers和references首先你必须认知一点,没有所谓的 null reference。由于reference一定得代表某个对象,C++因此要求references必须有初值。Pointers和references之间的另一个重要差异就是,pointers可以被重新赋值,指向另一个对象,reference却总是指向(代表)它最初获得的那个对象。结论:当你知道你需要指向某个东西,而且绝不会改变指向其他东西,或是当你实现一个操作符而其语法需求无法由pointers原创 2020-12-25 17:13:25 · 180 阅读 · 0 评论 -
C++11拾穗
C++11新关键字alignas:指定对齐大小alignof:获取对齐大小decltypeauto(重新定义):可作为返回值类型后置时的占位符static_assert:静态断言using(重新定义):类型别名或者模板别名noexcept:声明函数不可以抛出任何异常export(弃用,不过未来可能留作他用)nullptrconstexpr:可在在编译期确认的常量表达式thread_local:等价于TLS快速初始化成员变量C++11中支持使用等号 = 或者花括号 {} 进行就地的(原创 2020-12-23 15:57:30 · 137 阅读 · 0 评论 -
c++11强化知识点
初始化列表(std::initializer_list)c++11提供了std::initializer_list,将使得类对象的初始化也可以和普通数组或者POD数据一样使用初始化列表的方式。只要为类对象提供初始化列表构造函数即可。std::initializer_list也可以作为函数的参数使用。初始化列表std::initializer_list相关示例代码如下。#include <iostream>#include <initializer_list>#incl原创 2020-11-15 10:00:32 · 132 阅读 · 0 评论 -
VSCode C++开发环境配置文件(Windows&Mac)
Windows(使用MSVC编译)c_cpp_properties.json{ "configurations": [ { "name": "Win32", "includePath": [ "${workspaceFolder}/**" ], "defines": [ "_DEBUG",原创 2020-10-06 13:57:21 · 366 阅读 · 0 评论 -
C++信号槽
什么是信号槽?简单来说,信号槽是观察者模式的一种实现,或者说是一种升华。一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知;一个槽就是一个观察者,通常就是在被观察的对象发生改变的时候——也可以说是信号发出的时候——被调用的函数;你可以将信号和槽连接起来,形成一种观察者-被观察者的关系;当事件或者状态发生改变的时候,信号就会被发出;同时,信号发出者有义务调用所有注册的对这个事件...原创 2020-01-12 14:50:01 · 1389 阅读 · 0 评论 -
C++实现简单的反射——根据字符串创建类对象
最近项目需求中需要一个关键功能——根据字符串创建了类对象。由于C++没有类似Java、C#这类动态语言中的反射机制,所以在C++程序中一般用if…else…或者switch来将字符串或者枚举值与类对象的创建方法来进行对应的映射。这里如果我们实现一个简单的反射机制,可以根据字符串创建了类对象就可以简化这个过程,而且无论对修改还是扩展都会更加方便。理想的使用方式就是我们需要这个功能的类统一继...原创 2019-12-15 16:11:41 · 2349 阅读 · 0 评论 -
C++面试再进阶
1、C++定义数组有大小限制吗?如何定义一个长度为一百万的数组?答:定义数组大小的限制主要是看数组定义在内存的哪个区域内。局部非静态的数组,空间在程序的栈上分配,不同平台的栈大小不同:SunOS/Solaris是8M,Linux是10M,Windows是1M,AIX是64M,都是可以调整的。也就是说,数组大小的限制就是堆或栈或全局存储区大小的限制。如果想定义长度一百万的数组可以将数组申明在全局存...原创 2019-12-12 09:36:14 · 323 阅读 · 0 评论 -
C++面试题进阶
1.问答题class ClassA{public: virtual ~ ClassA(){}; virtual void FunctionA1(){}; void FonctionA2(){};};class ClassB{public: virtual void FunctionB1(){}; void FonctionB2(){};};class ClassC : ...原创 2019-12-08 11:35:31 · 518 阅读 · 0 评论 -
大数乘法问题(C++版)
大数乘法问题是一个经典的算法题。所谓大数乘法问题其实就是这样的:输入两个整数,要求输出这两个数的乘积。输入的数字可能超过计算机内任何数据的存储范围。这里主要需要注意的点就是需要使用字符串或者字符数组来存储这两个大数以及他们的结果,还有乘法计算过程中存在乘法进位和加法进位。我先自己尝试写了一个答案,思路就是模拟手写竖式乘法。 static string MYMULTIPLY(const s...原创 2019-12-06 11:18:37 · 436 阅读 · 0 评论 -
C++智能指针作为成员变量
class Device {};class Settings { Device *device;public: Settings(Device *device) { this->device = device; } Device *getDevice() { return device; }}; i...原创 2019-10-19 17:14:38 · 3318 阅读 · 0 评论 -
std::string的format一种实现
由于std标准库的string没有实现类似CString的Format函数,使得我们有时候不得不使用istream、ostream来格式化字符串,然而这些类使用起来又复杂繁琐。在Windows下编程时我们还可以使用CString的Format函数,但是这里也可能会涉及到字符类型的转换等问题。而且使用CString的Format函数就意味着代码无法做到跨平台。于是我在VS下敲下了如下代码:#...原创 2019-10-13 15:52:28 · 955 阅读 · 0 评论 -
C++中使用JsonCpp
之前项目中我们客户端程序一直是使用XML与服务器通信,最近新增一些接口转向使用更简单的Json。我们都知道由于Json语法是 JavaScript 对象表示语法的子集。所以在Java,JavaScript等语言中使用起来是十分愉快的。在C++中我们使用跨平台的开源库JsonCpp也能愉快的玩耍Json。下载地址GitHub:https://github.com/open-source-pa...原创 2019-09-21 17:39:16 · 345 阅读 · 0 评论 -
C++代码书写规范——给新手程序员的一些建议
代码就是程序员的面子,无论是在工作中在电脑上写程序代码还是在面试时在纸上写演示代码我们都希望写出整洁,优雅的代码。特别在工作中当我们碰到需要维护别人的代码,或者是多人参与一个项目大家一起写代码的时候,如果碰到一些丑陋的代码,我们还要看懂并且修改它的时候,那种难受,肯定会让我们回想起多年以前自己还是新手程序员的时候,写下的那些丑陋的代码,并且深深内疚于将它们留给了我们的后继者,不知道他们和它们是否...原创 2019-09-14 18:12:52 · 218 阅读 · 0 评论