CPP
文章平均质量分 83
EnjoyCodingAndGame
Nothing raplaces hard work.
纸上得来终觉浅,绝知此事要躬行。
展开
-
C和C++11的std::assert
C语音的static_assert:C++11的static_assert:示例代码:#include <type_traits> template <class T>void swap(T& a, T& b){ static_assert(std::is_copy_constructible<T>::v...原创 2020-03-26 16:25:52 · 1534 阅读 · 0 评论 -
C++11之thread_local
C++11标准加入了thread_local这个修饰符,支持每个线程,拥有被thread_local修饰的全局变量的一份拷贝。原创 2020-03-26 12:41:24 · 801 阅读 · 0 评论 -
AOP 面向切面编程
什么是AOP?AOP全称Aspect Oriented Programming意为面向切面编程,也叫做面向方法编程,是通过预编译方式和运行期动态代理的方式实现不修改源代码的情况下给程序动态统一添加功能的技术。AOP技术利用一种称为“横切”的技术,剖解开封装对象的内部,将影响多个类的公共行为封装到一个可重用的模块中,并将其命名为Aspect切面。所谓的切面,简单来说就是与业务无关,却为业务模...转载 2020-03-17 12:04:31 · 610 阅读 · 0 评论 -
Defensive Programming 防御式编程(Defensive Programming)
Defensive Programming防御式编程(Defensive Programming)是提高软件质量技术的有益辅助手段怎么理解呢?防御式编程思想的理解可以参考防御式驾驶:在防御式驾驶中要建立这样一种思维,那就是你永远也不能确定另一位司机将要做什么。这样才能确保在其他人做出危险动作时你也不会受到伤害。你要承担起保护自己的责任,哪怕是其他司机犯的错误。防御式编程的主...转载 2020-03-14 16:20:46 · 2398 阅读 · 0 评论 -
常量指针与指针常量的区别
一、”const int” 与 “int const” 我们需要明白,const放在数据类型(int)前面和数据类型(int)后面是一样的。所以 const int *ptr 与 int const *ptr 是等价的二、简单理解“const int *ptr”, “const int * const ptr”, “int * const ptr”的本质含义 在原创 2016-09-25 21:31:27 · 651 阅读 · 1 评论 -
C\C++代码优化的27个建议
1. 记住阿姆达尔定律:funccost是函数func运行时间百分比,funcspeedup是你优化函数的运行的系数。所以,如果你优化了函数TriangleIntersect执行40%的运行时间,使它运行快了近两倍,而你的程序会运行快25%。这意味着不经常使用的代码不需要做较多优化考虑(或者完全不优化)。这里有句俗语:让经常执行的路径运行更加高效,而运行稀少的路径正转载 2016-09-19 15:35:37 · 404 阅读 · 0 评论 -
《C++高效编程:内存与性能优化》第十二章:优化IO
原创 2016-09-19 15:09:37 · 1949 阅读 · 0 评论 -
二叉树前序、中序、后序遍历相互求法
今天来总结下二叉树前序、中序、后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明。首先,我们看看前序、中序、后序遍历的特性(三种遍历方法,从语义上,是相对于根而言的): 前序遍历(根左右): 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历(左根右转载 2016-08-25 23:00:19 · 895 阅读 · 0 评论 -
POSIX thread (pthread) libraries
POSIX thread (pthread) librariesThe POSIX thread libraries are a standards based thread API for C/C++. It allows one to spawn a new concurrent process flow. It is most effective on multi-processor o转载 2016-09-16 21:42:45 · 1506 阅读 · 0 评论 -
内存池、进程池、线程池介绍及线程池C++实现
内存池平常我们使用new、malloc在堆区申请一块内存,但由于每次申请的内存大小不一样就会产生很多内存碎片,造成不好管理与浪费的情况。内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。原创 2016-09-16 20:36:33 · 6178 阅读 · 0 评论 -
《C++高效编程:内存与性能优化》第九章:高效内存管理
原创 2016-09-14 21:05:11 · 3359 阅读 · 0 评论 -
谈VC++对象模型
——谈VC++对象模型(美)简.格雷程化 译译者前言一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ Object Model虽然是一本好书,然而,书的篇幅多一些,又和具体的VC++关系小一些。因此,从篇幅和内容来看,译者认为本文是深入理解C转载 2016-09-15 20:40:19 · 685 阅读 · 0 评论 -
Bit field
Bit fieldFrom Wikipedia, the free encyclopediaIt has been suggested that Bit array be merged into this article. (Discuss) Proposed since May 2016.A bit field is a转载 2016-09-19 18:15:43 · 575 阅读 · 0 评论 -
typedef specifier
typedef specifiertypedef - creates an alias that can be used anywhere in place of a (possibly complex) type name.ExplanationThe typedef specifier, when used in a declar转载 2016-09-08 00:02:39 · 732 阅读 · 0 评论 -
Linux C/C++多线程学习:生产者消费者问题
生产者消费者问题多个生产者和多个生产者的问题。生产者不断的向仓库放入产品,消费者不断的从仓库取出产品,仓库的容量是有限的。因此,当仓库处于满状态时,生产者必须等待消费者取出 1 个或多个产品后才能继续生产;同理,当仓库处于空状态时,消费者必须等待生产者将产品放入仓库后才能消费(取出)产品。使用数组模拟仓库,需要记录下一次生产和消费在数组中的位置。 用生产和消费在数组中的位置判断原创 2016-09-20 18:55:17 · 5699 阅读 · 1 评论 -
C++11 auto vs auto& vs auto&&
auto and auto && cover most of the cases:Use auto when you need a local copy. This will never produce a reference. The copy (or move) constructor must exist, but it might not get called, d原创 2016-10-05 16:27:22 · 18288 阅读 · 0 评论 -
递归与尾递归(Tail Recursion)
1、递归 关于递归的概念,我们都不陌生。简单的来说递归就是一个函数直接或间接地调用自身,是为直接或间接递归。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。用递归需要注意以下两点:(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。递归一般用于解决三类问题原创 2016-10-07 15:56:49 · 4364 阅读 · 1 评论 -
Fuzzing简介以及使用AFL对LibTIFF进行模糊测试
1. Fuzzing简介Fuzz testing or Fuzzing is a software testing technique, often used to discover security weaknesses in applications and protocols. The basic idea is to attach the inputs of a program to原创 2017-12-16 20:20:36 · 3669 阅读 · 2 评论 -
OpenCV相机标定及距离估计(单目)
相机标定基本知识对于针孔摄像机模型,一幅视图是通过透视变换将三维空间中的点投影到图像平面。投影公式如下:或者这里(X, Y, Z)是一个点的世界坐标,(u, v)是点投影在图像平面的坐标,以像素为单位。A被称作摄像机矩阵,或者内参数矩阵。(cx, cy)是基准点(通常在图像的中心),fx, fy是以像素为单位的焦距。所以如果因为某些因素对来自于摄像机的一幅图像升采样或者...原创 2018-06-21 15:24:50 · 33433 阅读 · 8 评论 -
《C++11并发编程》读书笔记
1-4章初始的C++标准在1998年发布,13年后,C++标准委员会给语言本身,以及标准库,带来了一次重大的变革。新C++标准(也被称为C++11或C++0x)在2011年发布,带来一系列的变革让C++编程更加简单和高效。C++标准第一次承认多线程在语言中的存在,并在标准库中为多线程提供组件。这意味着使用C++编写与平台无关的多线程程序成为可能,也为可移植性提供了强有力的保证读者们...原创 2019-10-08 17:44:19 · 302 阅读 · 0 评论 -
C++语法特性cheat paper
1. explicit关键字C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。注:C++中不存在implicit关键字,C#等编程语言中才有,此处仅仅是为了说明。上面也已经说过了,explicit关键...原创 2019-10-08 20:54:54 · 761 阅读 · 0 评论 -
C++虚函数表解析
前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 关于虚函数的使用方法转载 2016-09-15 20:19:01 · 434 阅读 · 0 评论 -
使用Visual Studio查看C++类内存分布
书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承、虚函数存在的情况下。工欲善其事,必先利其器,我们先用好Visual Studio工具,像下面这样一步一步来: 先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到转载 2016-09-15 19:04:39 · 6526 阅读 · 3 评论 -
详细解说 STL 排序(Sort)
一切复杂的排序操作,都可以通过STL方便实现 !0 前言: STL,为什么你必须掌握对于程序员来说,数据结构是必修的一门课。从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来。幸运的是这些理论都已经比较成熟,算法也基本固定下来,不需要你再去花费心思去考虑其算法原理,也不用再去验证其准确性。不过,等你开始应用计算机语言来工作的时候,你会发现,面转载 2016-03-09 21:54:00 · 366 阅读 · 0 评论 -
STL sort源码剖析
STL的sort()算法,数据量大时采用Quick Sort,分段递归排序,一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来过大的额外负荷,就改用Insertion Sort。如果递归层次过深,还会改用Heap Sort。本文先分别介绍这个三个Sort,再整合分析STL sort算法(以上三种算法的综合) --Introspective Sorting(内省式排序)转载 2016-03-09 21:56:15 · 425 阅读 · 0 评论 -
指针的指针与指向指针数组的指针
1.指针的指针(二级指针) 指针的指针看上去有些令人费解。它们的声明有两个星号。例如: char ** cp; 如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针,依次类推。当你熟悉了简单的例子以后,就可以应付复杂的情况了。当然,实际程序中,一般也只用到 二级指针,三个星号不常见,更别说四个星号了。 指针的指针需要用到指针的转载 2016-03-08 19:57:01 · 683 阅读 · 0 评论 -
堆和栈的区别
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(转载 2016-03-09 20:41:43 · 366 阅读 · 0 评论 -
数组指针和指针数组的区别
1. 数组指针a pointer to an array,即指向数组的指针。定义: int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。将二维数组赋给数组指针:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4原创 2016-03-09 16:13:29 · 405 阅读 · 0 评论 -
指针函数与函数指针的区别
1、指针函数 指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针。 类型标识符 *函数名(参数)int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。表示:f转载 2016-03-08 19:48:26 · 353 阅读 · 0 评论 -
RTTI(Run-Time Type Identification)、虚函数和虚基类的实现方式、开销分析及使用指导
RTTI(Run-Time Type Identification)、虚函数和虚基类的实现方式、开销分析及使用指导为了说明RTTI、虚函数和虚基类的实现方式,这里首先给出一个经典的菱形继承实例,及其具体实现(为了便于理解,这里故意忽略了一些无关紧要的优化):图中虚箭头代表偏移,实箭头代表指针由上图得到每种特性的运行时开销如下: 特性时间开销转载 2016-03-08 17:00:15 · 571 阅读 · 0 评论 -
前缀++ 后缀++ 运算符重载
编译器如何识别重载的可以前置或后置的自增及自减运算符函数呢,通过函数的参数不同来区别。后置自增运算符的参数里有个int型的伪值0,而前置自增运算符函数的参数里没有。 后置自增运算符以值的形式返回类的对象,而前置自增运算符以引用的形式返回类的对象,因为后置自增运算符通常在自增前返回一个包含对象原始值的临时对象。C++将这样的对象视为右值,不能用于赋值运算符的左边。前置自增运算符转载 2016-03-16 18:09:12 · 2830 阅读 · 0 评论 -
析构函数 private 、virtual的作用
类中“私有”权限的含义就是:私有成员只能在类域内被访问,不能在类域外进行访问。 把析构函数定义为私有的,就阻止了用户在类域外对析构函数的使用。这表现在如下两个方面: 1. 禁止用户对此类型的变量进行定义,即禁止在栈内存空间内创建此类型的对象。要创建对象,只能用 new 在堆上进行。 2. 禁止用户在程序中使用 delete转载 2016-03-15 21:52:15 · 794 阅读 · 0 评论 -
Other data types
Type aliases (typedef / using)A type alias is a different name by which a type can be identified. In C++, any valid type can be aliased so that it can be referred to with a different identifier.转载 2016-03-28 20:01:17 · 601 阅读 · 0 评论 -
深入理解extern "C"
在用C/C++的项目源码中,经常会看到下面结构的代码:#ifdef __cplusplusextern "C" {#endif /*...*/ #ifdef __cplusplus}#endif这段代码到底有什么用呢,你知道吗?而且这样的问题经常出现在面试/笔试中。下面我就深入介绍下它:1. #ifdef _cplusplus/#endif _cplusplus原创 2016-08-18 16:49:32 · 643 阅读 · 0 评论 -
详细介绍C++中的类对象内存模型
内存模型描述的是程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节.不同平台间的处理器架构将直接影响内存模型的结构.首先介绍一下C++中有继承关系的类对象内存的布局:在C++中,如果类中有虚函数,那么它就会有一个虚函数表的指针__vfptr,在类对象最开始的内存数据中。之后是类中的成员变量的内存数据。对于转载 2016-09-12 23:14:23 · 6550 阅读 · 1 评论 -
C++构造函数和析构函数中抛出异常的注意事项
从语法上来说,构造函数和析构函数都可以抛出异常。但从逻辑上和风险控制上,构造函数和析构函数中尽量不要抛出异常,万不得已,一定要注意防止资源泄露。在析构函数中抛出异常还要注意栈展开带来的程序崩溃。1.构造函数中抛出异常在C++构造函数中,既需要分配内存,又需要抛出异常时要特别注意防止内存泄露的情况发生。因为在构造函数中抛出异常,在概念上将被视为该对象没有被成功构造,因此当前对象的析构转载 2016-09-15 00:13:39 · 2264 阅读 · 0 评论 -
C++虚析构函数及纯虚析构函数
C++中析构函数可以为纯虚吗?众所周知,在实现多态的过程中,一般将基类的析构函数设为virtual,以便在delete的时候能够多态的链式调用。那么析构函数是否可以设为纯虚呢?class CBase{public: CBase() { printf("CBase()\n"); } virtual ~CBase() = 0;};答案是可以转载 2016-09-14 23:40:49 · 1264 阅读 · 0 评论 -
C++模板之特化与偏特化详解
前言说到C++模板,这个已经不是什么新东西了,自己在实际开发中也用过;对于C++模板特化和偏特化,对于别人来说,已经不是什么新东西了,但是对于我来说,的确是我的盲区,那天在群里讨论这个问题,自己对于这部分确实没有掌握,又联想到在《STL源码剖析》一书中,对于此也是有着介绍。所以,今天就对此进行详细的总结,以备后忘。C++模板说到C++模板特化与偏特化,就不得不简要的先说说C转载 2016-09-14 18:51:24 · 1634 阅读 · 0 评论 -
C++开发者都应该使用的10个C++11特性
在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛。不过我相信这些新特性当中有一些,应该成为所有C++开发者的常规装备。你也许看到过许多类似介绍各种C++11特性的文章。下面是我总结的,C++开发者都需要学习和使用的C++11新特性。auto在C++11之前,auto关键字用来指定存储期。在新标准中,它的功能变为类型推断。auto现在成了一个类型的占位符原创 2016-09-14 15:25:56 · 2214 阅读 · 0 评论 -
Exception safety
Exception safetyException safety guarantees, originally formalized by David Abrahams,[1][2] are a set of contractual guidelines that class library implementers and clients can use when reaso转载 2016-09-02 17:39:47 · 574 阅读 · 0 评论