C/C++
文章平均质量分 81
FreeeLinux
A3GM5H3647LPD4QVYMYAER2S47P4WZ2UKBXBCGZES2V62WEY2HULQA
展开
-
反汇编专用工具——objdump
命令参数:-d: 将代码段反汇编-S: 将代码段反汇编的同时,将反汇编代码和源代码穿插显示,编译时需要给出-g,即需要调试信息-C: 解决Name mangling导致函数名无法看懂的问题-l: (小写L)插入源代码的文件名称和行号-j section: 仅反汇编指定的section。可以有多个-j参数来选择多个section-M: 语法模式,例如att(AT&t),int...原创 2018-11-18 20:30:57 · 4000 阅读 · 0 评论 -
auto_ptr源码分析
By SmartPtr(http://www.cppblog.com/SmartPtr/)auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针, 或许相对于Loki中那个无所不包的智能指针,这个不怎么智能的智能指针难免会黯然失色。诚然,auto_ptr有这样那样的不如人意,以至于程序员必须像使用”裸“指针那样非常小心的使用它才能保证不出错,以至转载 2017-01-18 15:14:46 · 668 阅读 · 0 评论 -
STL源码剖析——list容器的排序算法sort()
前言 由于STL本身的排序算法sort接受的输入迭代器是随机访问迭代器,但是双向list链表容器的访问方式是双向迭代器,因此,不能使用STL本身的排序算法sort,必须自己定义属于自己访问的排序算法。我们从源码的剖析中,可以看到该排序算法思想类似于归并排序。list容器之排序算法sort 在该排序算法的实现过程中,定义了一个类似于搬运作用的链表carry和具有中转载 2017-01-01 15:28:13 · 1122 阅读 · 0 评论 -
C++模板之trait与模板技巧
一:trait1.Fixed Traits主要是构造适应各种类型的函数Fixed主要指,一旦定义了这个分离的 trait,则无法在算法中进行改写。value trait 是用于针对型别进行 value 方面的操作,如 zero(),它是 fixed trait 和下面的另外一种参数化萃取的一部分。template class accumulation_traits;t原创 2016-12-31 20:12:31 · 2342 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记第三章:Data语意学
这是第三章,第三章当时我的博客: C++对象模型Data语意学分析、虚继承底层实现机制 写的比较详细,所以这次可能总结会少一些。关于 class 的大小分析上面提到的博客有详细分析。对于 origin.x=0.0 和 pt->x=0.0 两种方式存取数据有什么重大差异?答案是:当调用类是一个派生类,而且在其继承体系中有一个虚基类,并且被存取的成员(如本例的x)是一个从该虚基类继原创 2016-12-30 17:05:55 · 644 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记第七章:站在对象模型的尖端
模板:对于类来说,只有成员函数在被使用的时候,才会被具现出来。之所以如此,主要有两个原因:空间和事件的考虑。可能只使用少数成员函数,不需要具现全部。尚未实现的机能。并不是一个 template 具现出来的所有类型一定能够完整支持一组成员函数所需要的运算符。如果只具现真正用到的成员函数,编译器就能够支持哪些对于其他成员函数可能造成编译错误的类型。(比如T t = 1024,t 或原创 2016-12-31 13:35:53 · 476 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记第六章:执行期语意学
C++保证一定会在 main() 函数之前构造出全局对象,在 main() 函数结束之前把全局对象摧毁掉。这是静态的初始化操作和内存释放操作。C++中所有的全局对象都放在程序的 data segment 中。如果明确给它一个值,对象将以该值为初值,否则对象所配置到的内存内容全为 0。包括 POD类型,这个C语言不一样。在C中专门有 .bss 段来存放未初始化的全局变量。cfront原创 2016-12-31 12:37:08 · 667 阅读 · 0 评论 -
C++ 的 new 关键字深入理解
new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:转载 2016-12-31 11:02:49 · 1627 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记第二章:构造函数语意学
第二章主要分析编译器什么情况下为我们合成默认构造函数,我的这篇博客已经写得很详细了: C++编译器默认构造函数合成机制分析,这次只写一些其他要点。编译器在四种情况下会为未声明构造函数的类合成默认(nontrival)构造函数。被合成出来的构造函数只能满足编译(而非程序)的需要,分别是:(1)包含的成员对象有默认构造函数。(2)继承的基类有默认构造函数。(3)该类含有虚函数,需要原创 2016-12-30 02:15:03 · 704 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记第四章:Function语意学
C++中类的非静态成员函数和一般函数具有相同的效率,编译器内部会将成员函数转化为对等的普通函数实体,比如加上 this 指针。一般而言,编译器对函数会用 ”mangling“ 手法进行命名处理,这也是函数重载的支持手段。独立于 class object 之外的存取操作,在某个时候特别重要。比如说 static 成员函数,它的主要特性是没有 this 指针,因此差不多等同于非成员函数,所以它可以成为原创 2016-12-30 21:44:54 · 547 阅读 · 0 评论 -
C++对象模型Data语意学分析、虚继承底层实现机制
1. Class 的大小一个空 class 的大小为 1 字节,因为编译器需要安插进去一个 char,使得这个 class 对象得以在内存中被配置独一无二的地址。虽然空 class 大小为 1 字节,但是假如某个类 A 继承该空 class,计算类 A 的大小时会优化父类空 class 的大小,如类 A 为空,sizeof(A) = 1,不空,则为类A真实数据大小。我们通常说某个 cl原创 2016-12-25 22:08:22 · 937 阅读 · 0 评论 -
关于NRV优化详细分析
在C++中,函数返回整数或指针是通过eax寄存器进行传递的,理解起来比较简单。 但是返回对象或结构体一直是令人感到困惑的问题。今天我整理了一下,将整个返回过程写下来,以作备用。 还是先通过一个例子来理解这个问题:首先,定义一个类Vector:class Vector{public: int x,y;};然后定义函数add(转载 2016-12-30 12:11:12 · 1745 阅读 · 0 评论 -
Effective C++ 第六章--继承与面向对象设计笔记
条款32确定你的public继承塑模处is-a关系 条款32:确定你的public继承塑模处is-a关系”public继承“意味着is-a。原创 2017-01-19 18:48:28 · 516 阅读 · 0 评论 -
scoped_ptr源码剖析
scoped_ptr是一个很类似auto_ptr的智能指针,它包装了new操作符在堆上分配的动态对象,能够保证动态创建的对象在任何时候都可以被正确地删除。但scoped_ptr的所有权更加严格,不能转让,一旦scoped_ptr获取了对象的管理权,你就无法再从它那里取回来(reset函数是重置,会清空自己,同样无法取回)。 源码剖析源码如下:namespace boost{// scoped原创 2017-01-20 18:26:17 · 564 阅读 · 0 评论 -
一致性哈希算法C++模板实现
关于一致性哈希概念上的理解可以参考:http://blog.csdn.net/cywosp/article/details/23397179 参考代码:http://www.cnblogs.com/coser/archive/2011/11/27/2265134.html一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因原创 2016-11-05 08:27:24 · 1675 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记第一章:关于对象
有点尴尬,这个笔记已经记过一遍了。重新来过的原因是我读到第五章左右觉得自己对这本书认识不够深刻,暂时就没有记笔记。今天正式把书通读了一遍了,然后现在读第二遍,这一遍我每章都会写一篇博客总结,只总结重点,精要,所以会简短一些。我会以条款的形式来总结。1.从C到C++,使用 class 封装数据一般并不会增加成本。数据成员就像在 C struct之中一样,而成员函数不在 class 内部,原创 2016-12-29 23:48:42 · 538 阅读 · 0 评论 -
intrusive_ptr源码分析
intrusive_ptr是一个侵入式的引用计数型智能指针,它可以用于以下两种情形:对内存占用要求非常严格,要求必须与原始指针一样现存代码已经有了引用计数机制管理的对象boost库不推荐使用intrusive_ptr,因为shared_ptr已经非常强大且灵活,工作足够好,可以满足绝大部分的需要。下面来看一下intrusive的源码:template<class T> class intrus原创 2017-01-22 18:36:06 · 803 阅读 · 0 评论 -
shared_ptr的理解和注意事项
昨天把shared_ptr的源码分析了一遍,也看了一些有关shared_ptr分析的文章,今天自己来总结一下。 以独立语句将newed对象置入智能指针对于下面这样一个使用智能指针的函数调用,可能会造成内存泄漏:process(std::shared_ptr<int>(new int(10)), priority());编译器没有规定传入参数的调用顺序,可能先执行new表达式,然后执行priori原创 2017-01-22 17:35:46 · 3910 阅读 · 0 评论 -
shared_ptr的线程安全性分析
shared_ptr线程安全性分析正如《STL源码剖析》所讲,“源码之前,了无秘密”。本文基于shared_ptr的源代码,提取了shared_ptr的类图和对象图,然后分析了shared_ptr如何保证文档所宣称的线程安全性。本文的分析基于boost 1.52版本,编译器是VC 2010。shared_ptr的线程安全性boost官方文档对shared_ptr线程安全性的正式表述是:转载 2017-01-22 12:59:19 · 1067 阅读 · 1 评论 -
为什么多线程读写shared_ptr需要加锁
陈硕(giantchen_AT_gmail_DOT_com)2012-01-28最新版下载:http://chenshuo.googlecode.com/files/CppEngineering.pdf我在《Linux 多线程服务端编程:使用 muduo C++ 网络库》第 1.9 节“再论 shared_ptr 的线程安全”中写道:(shared_ptr)的引用计数本身是安全转载 2017-01-22 12:56:59 · 965 阅读 · 0 评论 -
动态内存管理详解:malloc/free/new/delete/brk/mmap
c 内存获取和释放 malloc/free, calloc/realloc上述8个函数/操作符是c/c++语言里常用来做动态内存的申请和释放的,要理解这些接口,大概需要下面几个维度的了解:1. 了解OS的进程空间模型,一个进程的地址空间,一般划分为内核区、用户区,用户区又划分为栈区、堆区、数据区、代码区。这里的‘堆区’,‘栈区’,‘数据区’,‘内核区’,其实就是一个转载 2016-12-31 11:28:01 · 522 阅读 · 1 评论 -
weak_ptr源码分析
之前分析了shared_ptr的框架,这次来说一下shared_ptr的兄弟weak_ptr,它们常常是一起出现的。weak_ptr顾名思义就是弱指针,它不会增加对象的引用计数,欸有重载operator*和operator->,使用时,应当通过weak_ptr的lock函数构造一个shared_ptr。作用:防止循环引用(以后博客分析)。应用:在enable_shared_from_this类中,它原创 2017-01-21 21:54:36 · 2001 阅读 · 0 评论 -
shared_ptr源码分析后续
上次剖析了shared_ptr类的源码,本来肯定也是要说shared_count的,不过由于篇幅,shared_count在这篇博客分析。shared_ptr类自身有两个成员,一个就是T类型指针,另一个就是shared_count对象了。shared_ptr把所有的计数任务都交给了该成员,最终指针的销毁也是由该对象去执行的(底层实际还有sp_counted_base)。这是一种解耦的思想。 源码原创 2017-01-21 21:29:19 · 1147 阅读 · 0 评论 -
shared_ptr源码分析
shared_ptr与scoped_ptr一样包装了new操作符在堆上分配的动态对象,但它实现的是引用技术型的智能指针,可以自由地被拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0时)它才删除包装的动态分配的对象。shared_ptr也可以安全地放到标准容器中,弥补了auto_ptr因为转移语义而不能把指针作为STL容器的缺陷。 源码分析首先看shared_ptr类:template原创 2017-01-21 20:36:24 · 4442 阅读 · 1 评论 -
scoped_array源码剖析
scoped_array很想scoped_ptr,它包装了new[]操作符(不是单纯的new)在堆上分配的动态数组,为动态数组提供了一个代理,保证可以正确的释放内存。 源码剖析scoped_array的源码如下:namespace boost{// scoped_array extends scoped_ptr to arrays. Deletion of the array pointed原创 2017-01-20 19:38:47 · 472 阅读 · 0 评论 -
C++拷贝构造函数、无名临时对象以及NRV优化分析
那么什么时候编译器会为一个 class 生成一个 default copy constructor 呢?和 default constructor 一样,C++ Standard 上说,如果 class 没有声明一个 copy constructor,就会有隐含的声明(implicitly declared)或隐含的定义(implicitly defined)出现,和以前一样,C++ Stan原创 2016-12-24 04:53:18 · 1308 阅读 · 0 评论 -
C++程序编译过程详解
转自:http://blog.csdn.net/amnotgod/article/details/41808239C++程序编译过程一般来说,我们可以把C++程序编译过程分为以下三步编译预处理主要进行源码级别上的操作,预处理器执行源码中的预处理命令(以‘#’号开头的语句),其中预处理命令可以分为以下几类a. 宏定义命令[ #define转载 2016-12-30 00:39:37 · 536 阅读 · 0 评论 -
关于字符串指针的一些问题及字符串的左旋转代码
程序如下:#include int main(){ char *s = "hello world"; //printf("%s", *s); printf("%s\n", s); printf("%c\n", *(s+1)); printf("%s\n", s+1); printf("%c原创 2016-06-13 21:25:58 · 600 阅读 · 0 评论 -
关于sizeof在调用函数中获取被调函数数组长度的思考
我们知道, sizeof 是一个操作符,其作用是返回一个操作数所占的内存字节数。那么在函数调用中,如何求一个被调函数数组的长度呢?现在我们来看下面的示例代码:#include void f(int a[]){ for(int i=0; i<sizeof(a)/sizeof(int); ++i){ a[i] = i; }原创 2016-06-14 19:17:15 · 2306 阅读 · 0 评论 -
结构体的初始化
结构体的初始化方式有多种,还有结构体数组的初始化,虽然好多平时用不到,但还是有必要了解一下。1.结构体初始化struct Student{ int id; char name[10]; int score;};定义一个结构体变量并初始化方法有: struct Student stu1 = {1, "Lily", 80}; s原创 2016-06-15 11:15:42 · 1106 阅读 · 0 评论 -
使用scanf初始化指针
无意间想到用scanf初始化指针,觉得挺有意思的,代码如下:#include int main(){ int num = 5; printf("%p ", &num); int *p = NULL; scanf("%p", &p); printf("%p\n", p); printf("%d\n", *p);原创 2016-08-25 10:58:18 · 3941 阅读 · 0 评论 -
大小端模式解析(联合体union)
以前一直知道大小端,很久不做题又把大端和小端记混了,这次来总结一下,以后再也不会混了。一:什么是大小端大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中原创 2016-09-22 12:24:29 · 3995 阅读 · 1 评论 -
C++引用计数思想--利用引用计数器自定义String类
什么是引用计数? 最直观的垃圾收集策略是引用计数。引用计数很简单,但是需要编译器的重要配合,并且增加了赋值函数 (mutator) 的开销(这个术语是针对用户程序的,是从垃圾收集器的角度来看的)。每一个对象都有一个关联的引用计数 —— 对该对象的活跃引用的数量。如果对象的引用计数是零,那么它就是垃圾(用户程序不可到达它),并可以回收。每次修改指针引用时(比如通过赋值语句),或者当引原创 2016-07-31 19:54:43 · 2149 阅读 · 0 评论 -
C++调用Python的工具类
最近参考了别人的C++调用python方法,我把它封装成了一个pyinit的工具类。这样可以使我们在主函数中,只需很少的几步就可以完成python的调用。pyinit.h#ifndef _PYINIT_H#define _PYINIT_H#include typedef PyObject py_object; //这个替换是我的个人习惯,我很少用大写的class原创 2016-11-20 12:48:58 · 647 阅读 · 0 评论 -
C++模板之SFINAE技术
今天在阅读muduo库的源码时,里面有这样几行代码:templatestruct has_no_destroy{ template static char test(typeof(&C::no_destroy)); // or decltype in C++11 template static int32_t test(...); const static bool val原创 2016-12-02 03:06:47 · 4565 阅读 · 1 评论 -
STL拾遗之map操作
1.构造 template map(); // 默认构造函数 map(const map& m) // 拷贝构造函数 map(iterator begin, iterator end ); //区间构造函数 map(iterator begin, iterator end, const traits& _原创 2016-11-29 02:04:05 · 419 阅读 · 0 评论 -
网易笔试题--寻找优雅点
今天在做网易笔试题的时候吃了一个血的教训,没有注意到隐式转换。 题大概是这样的,给一个圆的周长,求圆上横纵坐标都为整数的点。 如: 25 (0,5)(0,-5)(5,0)(-5, 0)(3,4)(3,-4)(4,3)(-4,3)共8个。我是采用这么做的,目前这样做,有更好办法我会更新此篇博客的。代码如下:#include #include #include usi原创 2016-09-12 21:32:16 · 1156 阅读 · 1 评论 -
深入理解指针、指向数组的指针和数组名的的区别
首先我们来看一段程序:#include int main(int argc,char *argv[]){ int numbers[5] = {1, 2, 3, 4, 5}; printf("&numbers: %p\n", &numbers); printf("&numbers+1: %p\n", &numbers+1);原创 2016-06-13 10:18:01 · 910 阅读 · 1 评论 -
前置和后置++运算符的重载
首先是类的声明头文件:在类的生命中,分别用了四个函数实现重载的不同方式,已标注,程序可和类定义中的相应函数配合实现相应的重载功能。/******************************Integer.h***********************************/#ifndef _INTEGER_H_#define _INTEGER_H_class Integer原创 2016-06-04 18:01:03 · 1462 阅读 · 0 评论 -
deque容器的实现框架
vector底层采用的是一个数组来实现,list底层采用的是一个环形的双向链表实现,而deque则采用的是两者相结合,所谓结合,并不是两种数据结构的结合,而是某些性能上的结合。我们知道,vector支持随机访问,而list支持常量时间的删除,deque支持的是随机访问以及首尾元素的删除。 deque是double ended queue的缩写,读作deck。首先我们用一个图来说明转载 2016-12-28 22:42:42 · 612 阅读 · 0 评论