自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

墨篙和小奶猫

现实者不功利,理想者不空谈;仁爱者不软弱,刚直者不偏激

  • 博客(96)
  • 资源 (1)
  • 收藏
  • 关注

原创 Boost (2): dynamic_bitset二进制数

/** boost库中数据容器之一:dynamic_bitset* 配置环境: win32 + codeblock + mingw32-g++ + boost.1.66* author : Ranger_roger* time : 2018//3/2** 采用位运算往往可以取得意想不到的性能提升,位运算必然和二进制位数关联,C++为二进制位数提* 供了两个工具

2018-03-02 14:09:53 2463

原创 Boost (1): array

/** boost库中数据容器之一:array* 配置环境: win32 + codeblock + mingw32-g++ + boost.1.66* author : Ranger_roger* time : 2018//3/1*/#include <boost/array.hpp>#include <iostream>using namespace std;

2018-03-02 09:27:34 692

原创 模板元编程(1):完美转发和变长模板

#include <iostream>#include <typeinfo>#include <type_traits>using namespace std;struct A { A() {} A(const A& a) { cout << "Copy Constructed " << __func__ << endl; } A(A&& a) { cout << "Mo

2018-02-28 18:57:58 695

原创 杂货边角(26):强枚举类型enum class

枚举类型是C++从C继承而来的特性,但是枚举类型在C中的实现其实和宏无差别,即#define Male 0#define Female 1....//用枚举声明为enum {Male, Female}这种枚举类型和int整数的天然等价性很容易造成一些漏洞,如不同枚举名字域下的比较,并且传统的枚举类型中的符号是直接开发在父作用域中,这也容易导致符号冲突。而C++11引入的强枚举类型,非常好理解

2018-02-28 18:48:30 620

原创 杂货边角(25):完美转发

完美转发是C++11借助右值引用这个引入的特性而顺带完成的一个很美的特性,涉及到两个重要的概念:引用折叠和模板参数推导。#include <iostream>#include <type_traits>using namespace std;void RunCode(int && m ) { cout << "rvalue ref" << endl; }void RunCode(int & m

2018-02-28 18:40:06 247

原创 杂货边角(24):C++智能指针和垃圾回收

目录:Sec1 C C98的显式内存管理的不足Sec2 C11的智能指针Sec3 垃圾回收机制Sec1. C / C++98的显式内存管理的不足内存管理和垃圾回收是高级语言的重要特征,尤其是随着代码抽象程度的加深,C以及C++98将内存管理完全交给程序员的做法一直是让人诟病的地方,即在堆上显式地通过malloc/free或new/delete来管理所需内存。但是是人就一定会犯错,

2018-02-27 15:47:02 1097

原创 杂货边角(23):模板编程的SFINAE机制和enable_if使用

SFINAESFINAE全称:Substitution Failure is not an error.即在对模板函数调用进行实例化推导匹配时出现的无效函数将被删除,并且编译器不会报错,只有最终有一个可以匹配该次调用的实例化match即可。在对一个函数调用进行模板推导时,编译器会尝试推导所有的候选函数(模板、重载函数、普通函数),并最终结合偏特化原则,给出一个最好的匹配结果。如果在推导的过程中,出现

2018-02-26 16:26:31 470

原创 杂货边角(22):名字空间namespace的一二事

namespace一直是C++编程中封装性的重要概念,但是关于namespace的使用此前一直并没有太多总结,这里结合namespace的使用和C++11关于名字空间的新特性总结如下。 目录:Sec1 子命名空间间的信息交互Sec2 不同名字空间下的模板类特化问题Sec3 终极一问Sec1. 子命名空间间的信息交互C++ 程序是编译器中的”符号表“结合不同的符号名修改规则来管理不同文件不同名字

2018-02-25 16:51:58 307

原创 杂货边角(21):用户自定义字面量 operator "" _X

在C++编程中,用户自定义类或结构体是难以避免的事情,所以一旦遇到接受用户自定义的类或结构体作为参数的函数,那么必然难逃”先初始化变量–变量传值或传引用调用函数“,这就导致了编程过程中出现的不直观。struct T {...};void func(T t1, T t2) {...}...T temp1(xxxx);T temp2(xxxx);func(temp1, temp2);正所谓没有对

2018-02-25 15:55:03 357

原创 杂货边角(20):匿名非受限联合体实现类的“变长成员”variant member

#include <iostream>#include <cstring>using namespace std;/*联合体的使用,最主要的效果便是内存空间的节省,当然额外的附加作用便是灵活性,但是这种灵活性是以牺牲可读性为代价的*/union T { string s;//因为string 是非POD类型,string有non-trivial的构造函数,故而系统会删除T的默认构造

2018-02-25 10:09:31 394

原创 杂货边角(19):explicit显式类型转换限定符号

#include <iostream>using namespace std;struct Rational_1 { Rational_1(int n=0, int d=1) : num(n), den(d) { cout << __func__ << "(" << num << "/" << den << ")" << endl; } int num; /

2018-02-25 09:34:32 267

原创 杂货边角(18):POD类型

POD英文全称为Plain Old Data。是C++为了保持和C的兼容性而提出的一个重要概念,该种数据的最主要特征是可以使用memcpy(), memset()等传统的函数直接对数据内存进行字节级别操作。C++11从两个方面来判断一个数据类型是否是POD的。考虑到C++语言自带的数据类型往往都是直接继承自C的,故而完全可以默认为POD的,而C++相比于C在数据结构方面最大的多样性来源,便是用户自定

2018-02-25 09:00:38 253

原创 杂货边角(17):C++11的右值引用和移动语义

相信绝大多数人,在写C++代码时都会被函数返回值的多次传递弄混淆过。事实上,这涉及到堆栈的运行,对于一个子函数而言,除非程序员显式地调用new操作符,否则函数创建的对象只能在自己的临时栈上,子函数和父函数的临时栈不同,从而这必然存在多次传递的情况。以前在C++标准没有涉及到该问题时,都是编译器自作主张地进行优化,即所谓的RVO(return value optimization),但是编译器提供的R

2018-02-12 18:33:18 221

原创 杂货边角(16):C++11之后,类的所有构造函数

C++类声明中,编译器会默认帮助程序员生成一些他们未定义的成员函数,这样的函数被称为“默认函数”,这包括了以下一些自定义类型的成员函数: 1.构造函数; 2.拷贝构造函数 3.拷贝赋值函数(operator= (const Class & T) ) 4.移动构造函数 5.移动拷贝赋值函数(operator= (Class&& T) ) 6.析构函数 但是程序员一旦在类的定义中显式地声明

2018-02-12 17:07:05 200

原创 杂货边角(15):C++11引入的explicit显式转换控制

C++此前编译器默认的隐式类型转换机制,在解决程序的泛型应用上起到了不小的帮助,但是这种隐式的类型转换有可能会导致潜在的问题。举代码如下#include <iostream>using namespace std;struct Rational_1 { Rational_1(int n=0, int d=1) : num(n), den(d) { cout << __func

2018-02-12 16:54:27 582

原创 设计模式之四:策略模式和policy-based class

目录:基本模式之策略模式泛型设计policy-based class基本模式之策略模式策略模式的核心是封装各等效算法的多样性,将算法的选择(常用的是switch结构或者高端点的用反射机制)隐藏在中间层,从而解放使用者的编程复杂度。demo也很简单,参考自大话设计模式中的收银台程序来进行改造。#include <iostream>using namespace std;class CashSuper

2018-02-09 19:06:17 829

原创 杂货边角(14):C++11在构造函数方面的新特性

C++中类是面向对象编程的基础,但是一旦类的属性域很多时,必然面临着构造函数的数量爆炸,并且各个构造函数可能只存在局部的细节差异,故而为了应对这种存在明显代码段重复的情况,违背了代码重复即原罪的原则。C++11针对构造函数存在的代码臃肿问题专门引入了继承构造函数机制和委托构造函数机制,前者是用来针对子类和父类中的构造函数的重复问题,后者是针对本类中多个构造函数间差异微小导致的代码重复问题。目录:Se

2018-02-05 15:23:04 233

原创 杂货边角(13):利用可变参数模板根据函数指针得到返回值类型和形参类型

前面提到过variadic template机制最为核心的便是“递归”思想,这里通过一个比较生僻的使用案例来阐述可变参数模板,以及decltype和declval的使用示例。#include <iostream>#include <sstream>#include <type_traits>#include <typeinfo>using namespace std;class A{};t

2018-02-01 22:39:23 588

原创 杂货边角(12):C++11动态性来源之类型推断 && auto\decltype\追踪返回类型

在程序员眼中,如果非要二元论的谈论编程语言,那么相信很多人会说出语言存在动态和静态语言之分,其中静态语言以C++、Java为代表,而动态语言则以近年来风头正盛的Python、Ruby领衔。其实语言的动静之分主要是在于对变量进行类型检查的时间点不同,对于静态语言而言,类型检查是发生在编译阶段,因为变量在.data区或者堆栈上的占用空间大小要提前确定,这样才能给予地址分配;而对于动态语言而言,变量的类型

2018-02-01 22:08:34 491

原创 杂货边角(11):C++11之lambda匿名函数

匿名函数lambda思想是函数式编程的基础,其中以lisp为代表,以其抽象和迭代的思想让无数coder奉为圣经。函数式编程、命令式编程、面向对象编程、元编程等都是一种编程范型。而近年来的趋势是高级语言越来越多地引入多范型编程支持(如C++和Python都开始支持函数式编程)。C++11引入lambda特性,对于泛型编程和函数式编程的支持都极大提升。相比于lisp的lambda函数等同于C++98中的

2018-01-30 11:06:35 262

原创 设计模式之三:对象创建系列模式

前面一章《结构型系列模式》介绍了在程序框架设计中可以用到的几种特定场景下对应的针对性模式: 1. 如针对存在大量实例对象的环境下存在提升性能的需求,则可以采用享元模式,以提炼出使用场景下的不变的部分,以共享来减少实例对象数目; 2. 对遗留的子系统想要复用,但是又不想重构子系统,则可使用外观模式,让一组人构建外观类接口内部实现,另一组人则可以按照事先规定好的接口类进行编写,两组齐头并进; 3.

2018-01-24 16:03:54 273

原创 设计模式之一:六大设计原则

这里有篇文章关于各个原则结合代码进行较为清晰的阐述:http://www.uml.org.cn/sjms/201211023.asp#4个人觉得其实六大原则中,单一职责原则、开放-封闭原则其实是模块化编程时代的思想顺延,这两个原则显然是经过经验积累得到的代码可维护性的保证。而关于面向对象编程的三个重要思想则是面向接口编程(中间抽象层)、合成/聚合原则(减少不必要的强耦合)以及迪米特原则(增加中间代理

2018-01-23 10:18:21 201

原创 杂货边角(10):模板template和可变参数模板variadic template

前面说到可以通过反射机制来解放客户端对于同类型函数调用的手动分配,而将具体的定位和调用过程通过反射机制来实现,客户端输入的信息只需要是注册机中的function对应的key即可,这样可以在client程序中减少难看冗长的switch结构或if…else…结构。但是反射机制只是变相地将任务的复杂性交给了后台库的实现者,库的实现者依旧不得不挨个实现所有相似的函数个体。这里面重复的工作量可想而知,但是有什

2018-01-19 17:15:09 280

原创 杂货边角(9):C++实现事件委托机制

在设计模式中,根据耦合紧密度可以得到排序为:继承 > 依赖 > 组合/聚合 > 委托。其实个人感觉,事件委托机制说白了就是一个函数指针数组,通过注册绑定的函数,然后在特定的事件发生后触发遍历执行所有注册的函数,机制其实和C++运行库glibc中crtbegin.o和crtend.o收集当前程序中所有全局对象的初始化函数和析构函数,用以执行遍历操作一致。所以归根结底,事件委托机制的关键便是函数指针注册

2018-01-18 16:37:30 454

原创 杂货边角(8):C++实现反射机制

0. 反射机制是什么 最近在学习设计模式,经常能看到对反射机制的倍加推崇,如反射机制配合工厂方法模式可以有效减少逻辑判断分支存在导致不便维护的情况。所谓的反射的机制,即通过动态地字符串等输入参数为信息入口自动寻址调用相应函数的机制。比如如下场景/*****something forehead********/switch key{ case "调用SQL server数据库":

2018-01-17 15:03:55 252

原创 杂货边角(7):C++继承和多态的符号表角度解析

面向对象设计核心的思想便是抽象、封装、继承、多态和接口。继承机制是面向对象设计过程中动态性和模块性的来源,而多态性则是很多功能灵活性的来源。 0. C++继承机制 面向对象设计核心是抽象的思维,但是”重复两次的代码就可能有坏味道“,如果仅仅通过抽象将不同的功能模块具象成对象,但是不同对象间很可能存在着很强的相似性,如果独立成类,必然会造成重复,这便是继承机制出现的目的:复用。不过继承虽好,但是继

2018-01-17 13:10:36 788

原创 线程局部存储TLS

1. 运行库支持多线程操作的更改 多线程编程时,其实线程的访问权限是很高的,可以访问进程内存里的所有数据,甚至包括其他线程的堆栈,但是这种毫无边界的感觉就和不知边界的亲戚一样,显然是需要制衡的。所以线程需要配备只有本线程专属的线程专属存储空间(Thread Local Storage, TLS),即系统为线程单独开辟的存储空间。对于C/C++标准库来说,线程相关的部分是不属于标准库的内容的,它跟网

2017-12-28 22:46:44 788

原创 运行库:Linux下glibc和Windows下MSVC CRT对比

任何一个C程序要想要得到实现,都离不开背后的一套庞大的代码来进行支持(至少包括入口函数,以及其所依赖的函数所构成的函数集合等),这样一套背后代码被称为运行库,C语言的运行库叫做CRT(Runtime Library)。C语言的运行库某种程度上就是C语言的程序和不同操作系统平台之间的抽象层。它将不同的操作系统API抽象成相同的库函数(银弹理论的又一次胜利)。比如可以在不同OS上使用fread来读取文件

2017-12-28 13:45:27 3767

原创 Windows下动态链接之三:DLL Hell !

不止Linux下关于共享库存在版本兼容性困扰问题,Windows下DLL共享库的使用问题更甚。很多Windows的应用程序在发布release版本时会一次性将所有用到的DLL一起打包形成一个大的安装包,用户只需一键安装,无需关注具体的DLL文件的配置问题。但也正是这种黑盒操作导致了可能存在某次安装,将系统中的新版本DLL文件被旧版本DLL给覆盖掉,虽然安装的程序可以运行了,但是其他程序可能出现问题了

2017-12-27 17:26:16 1075 1

原创 Windows下动态链接之二:DLL优化加速

1. Windows动态链接下的导入函数的调用过程 在ELF结构下,函数调用因为有全局符号介入的可能,所以除非用static关键词修饰,否则只要是函数调用,无论是否是模块内还是模块外,都需要经过.got.plt间接跳转,来实现ELF结构下代码段的地址无关性。在PE文件结构下,是不存在全局符号介入的,所以对于模块内部的函数调用,编译器将产生直接调用指令CALL XXXXXXXX(不是相对地址偏移,

2017-12-27 17:08:59 1789

原创 Linux动态链接之七:共享库的创建和安装

创建共享库和一般的共享对象.so基本一致,主要还是GCC的两个参数-shared –fPIC(意义不用多说,分别指明共享和PIC地址无关)在前面说过gcc指令其实对于与cl\ld等具体程序的调用封装,故而完全可以在gcc指令传输一系列参数(比如传输一些参数给汇编器cl,一些参数给ld),-Wl便是在gcc指令中声明传给链接器ld的参数: $gcc -shared -Wl, -soname, m

2017-12-27 15:26:19 2457

原创 Linux动态链接之六:共享库管理和版本控制

1. 共享库的兼容性 1.兼容更新:所有的更新只是在原有的共享库基础上添加一些内容,所有原有的接口都保持不变; 2.不兼容更新:共享库更新改变了原有的接口,使用该共享库原有的接口的程序可能不能运行或运行不正常。谈到共享库和DLL等库文件的兼容性,则不得不谈到ABI(相比于API对应于源代码级别的接口管理,二进制层次的ABI对应的则是操作系统和底层机器码)对于不同的语言来说,主要包括一些诸如函数调

2017-12-27 11:05:56 1457

原创 Linux动态链接之五:运行时显式加载共享文件.so

动态链接更多是从.lib等模块分离组装的角度来看待问题,实际上,如果动态链接可以实现,那么在运行过程中动态加载.so对象也是可行的,这种共享对象被称为DLL,它其实和普通.so对象并无本质区别,只是程序的视角不同。运行时链接的技术手段常用来做插件、驱动加载等处理,因为不需要开始就全部加载进入进程,可以有效地减少程序启动时间和内存使用。对于Web服务器需要长期连续运行的场景,如果某个模块更新,显然不能

2017-12-27 00:09:28 1230

原创 Linux动态链接之四:动态链接的步骤

动态链接的步骤基本上分为3步: 1.启动动态链接器本身 2.装载所需要的共享对象 3.重定位和初始化1. 动态链接其ld.so自举 动态链接器入口地址即是自举代码的入口,当OS将进程控制权交给动态链接器时,动态链接器的自举代码开始执行。自举代码执行逻辑: 1.找到动态链接器自己的GOT段,GOT中第一项即是.dynamic段的偏移地址,然后找到该动态链接器本身的.dynamic段; 2.

2017-12-26 23:24:05 940

原创 Linux动态链接之三:动态链接相关结构

无论是静态链接还是动态链接,初始都是操作系统读取可执行文件的FILE_HEADER,以检查文件格式、操作权限等属性,然后根据段表获取各个”segment”的VMA虚拟装载位置、文件地址和操作属性RWXP等,再根据相似属性原则相连原则完成装载,而后将控制权交给文件头结构中e_entry入口地址(ELF程序的入口虚拟地址,可重定位文件不可执行,故而为0,静态链接的可执行文件便是指向运行库main初始化函

2017-12-26 22:30:39 1203

原创 Linux动态链接之二:优化加速之延迟绑定PLT

1. PLT延迟绑定的提出 动态链接速度损耗主要两方面: 1.对全局和静态的数据访问都要进行复杂的GOT定位,然后再间接跳转寻址; 2.动态链接的很多工作是在程序运行时完成的,动态链接器需寻找并装载目标共享对象、符号查找、地址重定位等,如果不加以优化,会出现程序启动过慢的情况。 故而需要出台一些优化动态链接策略的方法。动态链接下,模块之间包含大量的函数引用(全局变量往往较少,过多的全局变量会

2017-12-26 16:44:48 1667

原创 Linux动态链接之一:Linux下动态链接和地址无关性处理

1. 动态链接技术的诉求来源 静态链接:从目标文件到可执行文件,将所需的所有的模板链接,最终生成单一的可执行文件模块; 动态链接:单一的可执行文件模块被拆分成若干个模块,在程序运行过程中动态进行链接的方案。静态链接可以使得开发者可以专注地开发自己的程序模块,但随着程序规模的增大,静态链接的一次性链接装配存在浪费内存和磁盘空间、模块更新困难等问题。甚至说基本的字符串公用库函数,每个程序内部处理都要

2017-12-26 15:37:39 6274

原创 极致优化思想系列之二:操作系统内核极致提升时间效率的设计点滴

《极致优化思想系列》是我用来收集一些不同目的诉求场景下的一些前人的精巧的极致设计思想,这些设计思路充满了艺术性,以此系列来作为敦促自我驱动不断进步之意。《极致优化》的第二篇文章关注的便是“时间效率”这个最常见的criteria。由于时间效率的优化技术方方面面皆有,故而顺延着前一篇文章的节奏,本篇的内容限定在操作系统领域。本文始终留白,留待日后不定期添加新的成员。1. Linux动态链接下的INT和I

2017-12-25 22:59:14 272

原创 极致优化思想系列之一:操作系统内核极致提升空间效率的设计点滴

《极致优化思想系列》是我用来收集一些不同目的诉求场景下的一些前人的精巧的极致设计思想,这些设计思路充满了艺术性,以此系列来作为敦促自我驱动不断进步之意。《极致优化》的第一篇文章关注的便是“空间效率”这个最常见的criteria。而谈到空间的极致压榨利用,相信可能除了数据库便是操作系统了,由于数据库的技术暂时涉猎较少,故而本文先留白,留待日后不定期添加新的成员。1. 操作系统内存映射管理 先引入Li

2017-12-25 22:50:41 658

原创 系统内核之堆管理

相比于栈内存而言,堆这片内存的管理模式更为复杂,因为程序可能随时发出请求,并且申请一段内存,申请内存的大小不固定,释放的时间也不确定。栈在面向过程的程序设计中远远不够,因为栈上的数据在函数返回时就会被释放掉,所以无法将数据传递至函数外部,而类似于全局变量或模块间共享对象,这是要在编程序编译阶段就要存在的,以及一些规模超大的数据对象,这些数据存在栈上显然是不合理的。针对程序内部最为常见的动态分配内存的

2017-12-25 15:07:59 2010

串口读取程序

通过java程序调用本机上的串口!希望对正在找串口程序的你可以提供帮助!!

2012-12-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除