
cplusplus
文章平均质量分 67
kdb_viewer
这个作者很懒,什么都没留下…
展开
-
c++17 string_view
c++最为c程序员诟病的一点是,c++会在程序员不知道的地方申请和释放内存。c++库如stl等提供了良好的抽象,但是屏蔽底层操作的代价就是如果程序员不了解库的底层实现,就可能造成误用导致的性能损失,这里以std::string这个最常见的容器为例,从c++17的string_view展开,最后带来一个string特定场景下的使用优化。1、std::string的内存申请对c程序员来说,字符串从char*开始位置到'\0'结束,需要从字符串中切词通过移动指针指向子串的头部并提供新长度,c程序需要传入字原创 2021-05-09 22:06:24 · 3403 阅读 · 2 评论 -
pure virtual method called 纯虚函数被调用原理分析
程序退出或者组件析构过程中常发生一类“pure virtual method called”导致的core,前几栈帧如下:这里对该问题发生的原理做一个剖析并给出一个可复现该问题的简单demo前置知识一、虚函数表虚函数表的概念在很多如《c++ primer plus》等权威书籍中有详细阐述,这里简单回顾下虚函数表的概念虚函数表用于支持运行时多态,在继承关系中,父类声明的函数在子类的中可以用同名函数重写,这类函数按照静态调用的规则,根据指针、引用、原始对象的类型决定调用父类函数还是子类函数。原创 2021-03-23 15:14:53 · 2673 阅读 · 0 评论 -
c++ 动态库虚表问题导致的不兼容问题 实例
c++动态库在abi兼容方面臭名昭著,这里结合一个线上模块使用动态库导致出core的问题总结下动态库、虚函数表等知识,这里将线上遇到的问题抽象出一个极简的例子,三个文件include.h, main.cpp, func.cpp ,先上源码include.h:class Base {public: void virtual func1() = 0;};class Wrapper {public: Base *b;};extern void jj(Wrapper *);原创 2020-10-29 14:51:38 · 670 阅读 · 0 评论 -
goto语句在c++中的注意事项(C to C++移植)
健壮的程序要求,在一个函数内部,所有异常分支都要考虑回收资源,例如内存,若进入异常分支导致函数提前return,需要保证所有资源得到回收,否则会造成资源泄漏。C语言没有好的解决方案,需要程序员手动在所有异常分支增加释放机制,这样带来两个问题:一、增加了设计成本,既要保证所有分支兼顾,又要防止释放语句多次调用导致资源释放两次二、后续对该函数进行改造时,例如新增了一个异常分支,后来者很难注意到这个细节,程序的可维护性不好C中为了解决这个问题,常用两种方法,一种是封装一个资源清理函数,缺陷是针对每原创 2020-07-24 11:07:19 · 1238 阅读 · 1 评论 -
《c++并发编程实战解析》 无锁数据结构 doubly-buffered-data
多线程环境设计数据结构相比单线程,需要额外注意的是利用多线程提升并发度同时保持数据结构不变性,即满足如下两个原则:1、正确性,保证多线程并发访问没有 data race2、性能,保护最小的数据,提供最大的性能《c++并发编程实战》提供了一种【无锁数据结构】,注意这里无锁的含义不是真正无锁,而是利用数据结构特性保证运行时并发抢锁的线程数量最小,达到一种常态下访问数据结构不被锁阻塞的状态使用场景:1、读远多于写2、数据小,一般最大为几K字节的元数据3、数据可以应用到一致性状态机,即b原创 2020-05-22 17:57:32 · 1249 阅读 · 0 评论 -
C++ STL 算法
STL中所谓算法是用来处理容器的非成员函数,有两个通用部分:1.模板:提供数据的泛型2.迭代器:提供访问容器值的通用表示STL算法种类:1.非修改式序列操作,find(),for_each()2.修改式序列操作,transform(),random_shuffle(),copy()3.排序和相关操作,sort()4.通用数字运算前3种在头文件algorithm中,最...原创 2018-09-19 23:36:53 · 156 阅读 · 0 评论 -
C++ 几种数组
C++有3种数组,vector,valarray,array1.vector:是容器,优势是支持面向容器的操作和算法2.valarray:是一个类模板,面向数值计算,优势是重载了各种数学函数,方便数学计算3.array:其实是C数组,固定长度,但是提供了STL算法,比如begin(),end()等,优势是特定的需要固定长度数组的场景valarray的数学优势:例如,需要计算每个元素...原创 2018-09-20 00:21:51 · 1113 阅读 · 0 评论 -
C++11 initializer_list
使用的时候形如一个大括号初始化器,如下:vector<double>t{1.1, 2.2};原理是,容器类包含一个使用initializer_list<T>作为参数的构造函数,例如,vector<double>类包含一个initializer_list<double>的构造函数:vector<double>t({1.1, ...原创 2018-09-20 00:39:12 · 248 阅读 · 0 评论 -
c++ 操作hadoop
hadoop框架原理:流程是,将input转换成mapper使用的context格式,然后经过mapper处理后,转换成reducer使用的context格式,经过reducer处理之后,产生output。c++类库和头文件:hadoop提供的c++api类库和头文件,安装hadoop之后,类库在hadoop/hadoop-2.8.0/lib/native下,头文件在hadoop/...原创 2018-09-25 16:35:40 · 1885 阅读 · 0 评论 -
c++ primer plus 16.4.3 STL算法 next_permutation
c++ primer plus 16.4.3中关于next_permutation的描述是每次提供唯一的序列,实际是按照字典序排列的,从小到大输出,例如对于如下排列13542,下一个排列应该是14235,原理是:1.从右到左找第一个左邻比右邻小的,这里3比5小,找到32.然后找从右往左第一个比3大的,这里找到43.交换3,4,得到145324.然后对4右边的数字排序,得到14235...原创 2018-09-19 22:54:54 · 167 阅读 · 0 评论 -
C++ STL 函数对象
函数对象:1.函数名2.指向函数的指针3.重载了()的类函数名就是普通的函数,指向函数的指针会造成的一些问题是gdb、kdb的时候,调用栈会出现问题,因为这些调试工具跟踪的是函数名,用地址调用的时候符号表里面无法反应。使用重载了()的类对象的一个特点是可以使用额外的变量,例如构造对象的时候传入的私有成员数据。函数符:1.生成器:没有参数的函数符2.一元函数:一个参数...原创 2018-09-19 17:33:31 · 291 阅读 · 0 评论 -
C++泛型编程
面向对象编程关注数据,泛型编程关注算法。模板和迭代器:都是STL通用方法的组成部分,模板让算法独立于数据类型,迭代器让算法独立于容器类型。例如,对于在数组和在链表中查找特定值节点的find函数,模板提供了存储在容器中的数据类型的通用表示,还需要提供遍历容器中值的通用表示,这就是迭代器,理解迭代器的使用,类比模板。迭代器需要注意的概念:1.超尾STL设计中所有区间都是形如[a, b)...原创 2018-09-19 17:29:44 · 822 阅读 · 0 评论 -
c++ primer plus chapter11 使用类
一个简单的将两个对象相加赋值给第三个对象的例子,第一个版本使用成员函数,第二种版本使用运算符重载class Test{private: int i;public: Test(){} ~Test(){} Test sum(const Test &t) const; Test operator+(const Test &t) cons...原创 2018-08-14 17:51:29 · 104 阅读 · 0 评论 -
c++ primer plus chapter12 类和动态内存分配
目前有两种构造函数,默认构造函数和普通的传参数的构造函数,如下:class Test{private int i;public: Test(){} //默认构造函数 Test(int _i){i = _i;} //普通构造函数};//对应的对象初始化方式如下Test tmp;Test tmp(10);但是有...原创 2018-08-15 19:24:10 · 130 阅读 · 0 评论 -
c++ primer plus chapter10 对象和类
面向对象编程OOP特性:1.抽象2.封装和数据隐藏3.多态4.继承5.代码可重用性10.2 抽象和类指定基本类型,比如int i,完成了3项工作:1.决定数据对象需要的内存数量2.决定如何解释内存中的位3.决定可用数据对象执行的操作或方法对于内置类型,这些操作内置到编译器,新创建类型,这些工作需要自己完成。新建类标准流程是,类定义放在头文件,类方法实...原创 2018-08-13 20:40:42 · 128 阅读 · 0 评论 -
c++ primer plus chapter13 类继承
公有继承格式:class basic{};class derive : public basic{};basic是基类,derive是派生类。对于公有继承,基类公有成员成为派生类的公有成员,基类的私有成员也会成为派生类的一部分,但是派生类不能直接访问,要通过基类公有方法。派生类中可以添加自己的成员,派生类构造函数必须给新加的成员和集成的成员提供实数据,但是由于不能直接设置...原创 2018-08-16 11:39:59 · 127 阅读 · 0 评论 -
c++ primer plus chapter14 c++中的代码重用
valarray类:由头文件valarray支持,是用于处理数值的数组,语法如下:/* 一个int类型数组a,长度是0 */valarray<int> a;/* 一个int类型数组,长度是8 */valarray<int> a(8);/* 一个int类型数组,长度是8,初始值全是10 */valarray<int> a(10, 8)/* 使用a...原创 2018-08-16 20:16:41 · 140 阅读 · 0 评论 -
c++ primer plus chapter15 友元、异常和其他
友元类:既不是is-a关系,也不是has-a关系,比如电视和遥控。遥控可以改变电视的状态,因此应该把遥控作为电视的友元。友元类声明可以在public、protected、private部分,位置没有影响。若B是A的友元类,那么编译器需要先了解A类然后才能处理B类,方法是先定义A类,或者使用前向声明。一个例子如下:class Tv{friend class Remote;};clas...原创 2018-08-17 14:44:46 · 189 阅读 · 0 评论 -
c++ primer plus chapter16 string类和标准模板库
内容摘要:1.标准c++ string类2.模板auto_ptr,unique_ptr,shared_ptr3.标准模板库STL4.容器类5.迭代器6.函数对象functor7.STL算法8.模板intializer_listC语言提供的字符串相关函数在string.h和cstring中,而c++的string类是在头文件<string>中支持的,要...原创 2018-08-23 18:16:37 · 188 阅读 · 0 评论 -
c++ primer plus chapter2
c++和c的区别:1.c++中的main函数应该定义为int类型,c中可以是void2.c++的cout对应c的printf,c++的cin对应c的scanf3.c++中函数头的括号若是空的,和(void)含义一样,意思是没有参数,c中括号是空的意味着对是否有参数保持沉默4.c++头文件没有.h,c中有.h,引用c的头文件,取消.h,前面加c,比如c中的math.h,c++若要使用,用cmath5...原创 2018-07-05 22:48:48 · 143 阅读 · 0 评论