摘要:intro 毫无疑问,每个对象只有(最多)一个虚函数表指针,但是每个类是否只有一个虚函数表呢? 从两个比较常用的C++功能可以引申到这个疑问: 虚函数调用 一个派生类对象转换为基类指针后,通过该基类指针来调用虚函数,调用到的是派生类的虚函数。这个通过虚函数表很容易实现,但是调用虚函数的时候不仅仅是找
阅读全文
摘要:future/promise future提供了一个基于数据(future模板类型)的异步概念:对于一个类型T,可以在以后通过get接口获得这个类型T的变量。或者打个不太恰当的比方,当你获得一个future对象时,就获得了一个消费券(consumer):拿着这张券可以兑换(get)一个T类型的结果(
阅读全文
摘要:reference 引用是C++相对于C语言指针引入的一个新语法,可以以简单变量来使用指针。这种语法在使用的时候还是比较方便的,但是也在模板类型推导的过程中也带来了一些需要额外关注的细节。 例子 下面的例子中,rt是一个引用类型,问题是在模板参数函数Harry的定义中,模板参数TSECER并没有包含
阅读全文
摘要:遍历 hash表是一种比较简单和直观的数据结构,在查找时也有很好的性能。但是hash表不能提供有序遍历,这个是其特性决定,所以不足为奇。但是,更为实际的一个问题是如果遍历整个hash表中的所有元素? 直观上讲,可以遍历一个hash的所有桶(bucket),但是这样明显效率偏低,特别是如果hash表为
阅读全文
摘要:一、问题的原因 也不知道是更新gcc版本的原因,还是由于代码修改包含了特殊头文件,导致在新的环境中YouCompleteMe插件(以后简称为ycm)无法进行智能提示,即使对于最简单基础的vector等容器也识别错误,这个对于这么一个杀手级的应用来说就太不应该了。关键是这样就导致整个开发环境的使用就很
阅读全文
摘要:一、reference forwarding(引用转发)gcc实现及C++标准的规定 gcc-4.8.2\gcc\cp\pt.c/* Adjust types before performing type deduction, as described in [temp.deduct.call] a
阅读全文
摘要:一、问题的引入 对于lambda表达式的capture内容,比较知名的是capture-default,也就是通过“&”或者“=”引导的缺省捕捉,通常的做法大家应该都是使用"&"以引用的形式引入。但是如果捕捉内容为空时,此时语法如何处理?从文档上看,如果是global/tatic/thread/co
阅读全文
摘要:一、为什么会考虑这个问题 假设框架提供一种机制,这种机制对于处理之后的所有对象都会执行释放(delete)操作,但是对于一些存在于内存池中的结构,如果使用默认delete操作就会有问题,因为默认的delete操作是把指定内存当做堆中空间操作的,所以对于位于内存池中的类型就需要考虑是不是需要重载自己的
阅读全文
摘要:一、gcc对于new operator的说明 主要是说明:new操作在语法逻辑上看是在new之后一定要看到“类型”的,举个简单的例子:字面量100是一个常量而不是类型,所以语法 new (100)是语法错误的。 /* Parse a new-expression. new-expression: :
阅读全文
摘要:一 、为什么需要constexpr 有时候需要编译时常量,现在能想到的典型的场景是在确定一个数组长度的声明中。比方说,需要64个bit,也就是8个字节,在32位机器上,需要两个long,在64位机器上需要一个long。那么此时的声明大概可能是long bits[sizeof(long) == 32
阅读全文
摘要:一、标量类型的析构 下面是一种简化的模型,实际项目中通常对应着缓存区结构,可能会主动调用析构函数,但是这种类型不排除有标量类型的情况。下面的例子中是int类型,但是事实上可能更多的是一种指针类型,那么指针类型主动调用析构会清零吗?tsecer@harry: cat exp.call.dtor.cpp
阅读全文
摘要:一、operator的重载 这个关键字平时其实几乎不怎么使用,但是偏偏这个关键字和new/delete之类比较孤僻的关键字还经常一起出现,使整个情况看起来更加诡异。之前应该是在看C++ stl库中看到过在类成员中自定义转换函数的,就是希望让一个对象可以转换为bool类型(通常用在if之类的逻辑表达式
阅读全文
摘要:一、为什么注意到这个问题 之前在使用C风格的cast时候,一个比较烦的地方就是由于转换操作的优先级,导致转换出来的类型需要使用额外的一个括号抱起来,看起来非常臃肿。后来注意到在C++风格的转换符貌似优先级更高,虽然输入量有所增加,但是输入的时候比较流畅,因此看起来也更加流程。tsecer@harry
阅读全文
摘要:一、Makefile中的匹配 在Makefile中,可以通过不同的pattern指定不同目标的执行规则,在这个时候就会存在一个哪个target更合适的问题。这里Makefile中引入的是一个stem的概念,从stem中选择最短的。gnu make对该规则的说明A target pattern is
阅读全文
摘要:一、主要的问题 这里主要讨论的是C++中全局/静态局部对象析构函数的执行时机问题。我们知道:全局变量的初始化时在main函数执行之前完成,静态局部变量的初始化是在首次执行到所在函数时执行。但是这些对象的析构函数在什么时候执行,它们在多线程中的表象又是如何?下面首先看下例子:tsecer@harry:
阅读全文
摘要:一、使用场景 1、局部函数的需求场景及限制 在标准C++(C++11之前)中,是没有局部函数这种语法的。但是在有些场景下,使用局部函数可以极大的简化代码,比方说,输入参数是一个圆(由圆心和半径表示),判断给定的两个点,是否一个在圆外部,一个在内部,此时最好有一个判断一个点是否在圆形内部的函数接口,然
阅读全文
摘要:零、C语言中float类型变量定义的诡异性 在C语言中,float类型的定义比较特殊,特别是对于小数点左右侧数字的定义看起来也比较诡异:例如这种".005","10."等类型,问题是这种节省一个数字0,让浮点数看起来非常诡异的意义在哪里?不是不允许这种奇形怪状的定义,让浮点数看起来更加规范它不香吗?
阅读全文
摘要:一、变长模版参数(variadic template paramter) 1、语法说明 gcc源代码中对于该语法的解析是在gcc-4.8.2\gcc\cp\parser.c文件中完成,同样是"...",如何区分哪些是pack,哪些是expansion呢?从代码(的注释)上来看,只有在模版声明temp
阅读全文
摘要:一、问题 在使用stringstream对一个变量进行格式化的时候,发现格式化之后的字符串并不是一个可显示的字符,最后看了半天,发现问题在于这个变量定义的类型是char类型,导致格式化之后数值本身并没有变化。我记得这个问题甚至不是我第一次遇到,这个问题本身是一个很小的问题,但是既然几次遇到都没有什么
阅读全文
摘要:一、为什么考虑到这个问题 在看std::tr1的function实现时,看到一个问题。比方说在C++中可以通过指针获得一个变量的位置 tsecer@harry: cat function.cpp #include <tr1/functional> using namespace std::tr1;
阅读全文