【C/C++】
Mike江
A goal is not always meant to be reached, it often serves simply as something to aim at. ──Bruce Lee
目标不一定是需要达到的,目标往往只是用来帮助你瞄准方向。──李小龙
展开
-
C语言实现url的编码和解码
url提交信息为何要转码呢?因为url本身会有很多特殊字符。而提交的参数中如果再有特殊字符的话,url就不能区分哪些是参数内容,哪些是分隔符。尤其是unicode,gb18030,big5等多字节的编码,不知道里面会隐藏什么字节,因此必须全部转码。更多详情请看:《关于URL编码》本文代码为从PHP代码中修改而来,只保留了2个函数。字符’a’-‘z’,’A’-‘Z’,’0’-‘9’,’...转载 2017-01-07 18:19:20 · 15460 阅读 · 7 评论 -
MD5
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。更多详情,请自行百度。理论上MD5是不可逆的,而且MD5本来也不是作加密使用,而是用来校验数据的完整性。譬如,我们用迅雷下载电影,就有个MD5校验:平时,我们在云盘上,秒传文件,可以通过MD5校验实现:原创 2017-06-23 10:43:17 · 10407 阅读 · 0 评论 -
placement new的用法及用途
本文转自:http://www.cppblog.com/kongque所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。举例来说:class foo{};foo* pfoo = new foo;pfoo指向的对象的地址你是不能决定的,因为new已经为你做了这些工作。第一步分配内存,第二步调用类的构造函数。而place转载 2017-07-03 01:49:34 · 8784 阅读 · 0 评论 -
Protobuf 的 proto3 与 proto2 的区别
本文转自:https://solicomo.com/network-dev/protobuf-proto3-vs-proto2.html总的来说,proto3 比 proto2 支持更多语言但 更简洁。去掉了一些复杂的语法和特性,更强调约定而弱化语法。如果是首次使用 Protobuf ,建议使用 proto3 。1、在第一行非空白非注释行,必须写:syntax = “proto3”;2、字段规则移除转载 2017-06-27 19:01:16 · 5462 阅读 · 0 评论 -
浅析为什么 char 类型的范围是 : -128~+127
在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来也很简单容易, 以至于不用去思考为什么,不是有一个整型范围的公式吗: -2^(n-1)~2^(n-1)-1 n为整型的内存占用位数,所以int类型32位 那么就是 -(2^31)~2^31 -1 即 -2147483648~2147483647。转载 2015-07-24 08:52:23 · 39099 阅读 · 2 评论 -
C++11:智能指针
C++11中有unique_ptr、shared_ptr与weak_ptr等智能指针(smart pointer),定义在 memory 中。可以对动态资源进行管理,保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用。unique_ptrunique_ptr持有对对象的独有权,同一时刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)。unique_p原创 2017-08-17 11:20:05 · 8893 阅读 · 0 评论 -
C++11:用户定义字面量
本文转至:https://www.devbean.net/2012/05/cpp11-literals/用户自定义字面值,或者叫“自定义后缀”更直观些,主要作用是简化代码的读写。long double operator"" _mm(long double x) { return x / 1000; }long double operator"" _m(long double x) { retur转载 2017-08-17 20:38:58 · 4734 阅读 · 0 评论 -
C++11:常量表达式
常量表达式主要是允许一些计算发生在编译时,即发生在代码编译而不是运行的时候。这是很大的优化:假如有些事情可以在编译时做,它将只做一次,而不是每次程序运行时都计算。使用constexpr,你可以创建一个编译时的函数:constexpr int GetConst(){ return 3;}int main(){ int arr[ GetConst() ] = {0}; en原创 2017-08-18 00:03:23 · 5597 阅读 · 0 评论 -
C++11:可变参数的模板
概述在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号“…”:template<class ... T> void func(T ... args)//T叫模板参数包,args叫函数原创 2017-08-19 00:14:02 · 16885 阅读 · 1 评论 -
Base64
用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符。所以,如果要让记事本这样的文本处理软件能处理二进制数据,或者使用json保存二进制信息,需要先把数据先做一个Base64编码,统统变成可见字符,再保存。在Base64中的可打印字符包括大写英文字母A-Z、小写英文字母a-z、阿拉伯数字0-9,这样共有62个字符,此外两个可打印符号在不同的原创 2017-06-23 10:18:32 · 6624 阅读 · 0 评论 -
protobuf入门教程(六):导入定义(import)
消息格式info.proto文件内容如下:syntax = "proto3";//指定版本信息,不指定会报错package infopack; //package声明符message info //message为关键字,作用为定义一种消息类型{ string addr = 1; //地址 string group = 2; //分组}addressbook.proto原创 2017-06-30 12:32:55 · 30866 阅读 · 1 评论 -
《C和指针》:存储类型
存储类型变量的存储类型是指存储变量值的内存类型。变量的存储类型决定变量何时创建、何时销毁以及它的值将保持多久。有三个地方可以用于存在变量:普通内存、运行时堆栈、硬件寄存器。变量的缺省(默认)存储类型取决于它的声明位置。凡是在任何代码块之外声明的变量问题存储于静态内存中,也就是不属于堆栈的内存,这类变量称为静态变量。对于这类变量,你无法为它们指定其他存储类型。静态变量在程序运行之前创建,在程序的整个执转载 2017-04-11 14:26:58 · 1360 阅读 · 0 评论 -
《C陷阱与缺陷》:如何理解(*(void(*)())0)()?
有一次,一个程序员与我交谈一个问题。他当时正在编写一个独立运行于某种微处理器上的C程序。当计算机启动时,硬件将调用首地址为0位置的子例程。为了模拟开机启动时的情形,我们必须设计出一个C语句,以显式调用该子例程。经过一段时间的思考,我们最后得到的语句如下:(* ( void(*)() ) 0) ();像这样的表达式恐怕会令每个C程序员的内心都“不寒而栗”。然而,他们大可不必对此望而生畏,因为构造这类表转载 2017-04-04 10:38:25 · 21568 阅读 · 0 评论 -
《C陷阱与缺陷》:缓冲输出和内存分配
程序输出有两种方式:一种是即时处理方式,另一种是先暂存起来,然后再大块写入的方式,前者往往造成较高的系统负担。因此,C语言实现通常都允许程序员进行实际的写操作之前控制产生的输出数据量。这种控制能力一般是通过库函数 setbuf 实现的。如果 buf 是一个大小适当的字符数组,那么: setbuf(stdout,buf);语句将通知输入/输出库,所有写入到 stdout 的输出都应该使用 buf 作为翻译 2017-04-06 15:16:09 · 12643 阅读 · 0 评论 -
protobuf入门教程(一):简介和安装
1.1 简介1.1.1 什么是protobufprotobuf也叫protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 、json进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者原创 2017-06-27 17:29:57 · 11549 阅读 · 1 评论 -
protobuf入门教程(二):消息类型
操作流程1)在.proto文件中定义消息格式 2)使用protobuf编译器生成C++类 3)使用C++ API来读写消息C++编程指导:https://developers.google.com/protocol-buffers/docs/cpptutorial消息格式syntax = "proto3"; //指定版本信息,不指定会报错message Person //message为关键字原创 2017-06-29 17:17:52 · 19224 阅读 · 0 评论 -
protobuf入门教程(三):常用序列化/反序列化接口
C数组的序列化和反序列化#include "addressbook.pb.h"#include <iostream>using namespace std;/*//C数组的序列化和序列化API//在/usr/local/include/google/目录下,查找包含"SerializeToArray"所有的文件,同时打印所在行//sudo grep "SerializeToArray" -转载 2017-06-29 17:24:13 · 17933 阅读 · 0 评论 -
protobuf入门教程(四):repeated限定修饰符
限定修饰符说明repeated 代表可重复,我们可以理解为数组:syntax = "proto3";//指定版本信息,不指定会报错message Person //message为关键字,作用为定义一种消息类型{ string name = 1; //姓名 int32 id = 2; //id string email = 3; //邮件}messa原创 2017-06-29 17:45:44 · 45175 阅读 · 2 评论 -
protobuf入门教程(五):枚举(enum)、包(package)
枚举(enum)消息格式当需要定义一个消息类型的时候,可能想为一个字段指定某“预定义值序列”中的一个值,这时候可以通过枚举实现。syntax = "proto3";//指定版本信息,不指定会报错message Person //message为关键字,作用为定义一种消息类型{ string name = 1; //姓名 int32 id = 2; //id原创 2017-06-29 17:56:30 · 91494 阅读 · 1 评论 -
C++11:线程
在C++11之前,C/C++一直是一种顺序的编程语言。顺序是指所有指令都是串行执行的,即在相同的时刻,有且仅有单个CPU的程序计数器执行代码的代码段,并运行代码段中的指令。而C/C++代码也总是对应地拥有一份操作系统赋予进程的包括堆、栈、可执行的(代码)及不可执行的(数据)在内的各种内存区域。而在C++11中,一个相当大的变化就是引入了多线程的支持。这使得C/C++语言在进行线程编程时,不比依赖第三原创 2017-08-19 21:19:46 · 5919 阅读 · 0 评论 -
C++11:互斥量
为什么需要互斥量在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在此刻使用打印机打印东西,如果不做任何处理的话,打印出来的东西肯定是错乱的。#include <iostream> // std::cout#include <thread> // std::threa原创 2017-08-19 21:34:12 · 9583 阅读 · 0 评论 -
C++11:基于范围的for循环、静态断言
基于范围的for循环在C++中for循环可以使用基于范围的for循环,示例代码如下: int a[] = { 1, 2, 3, 4, 5 }; int n = sizeof(a) / sizeof(*a); //元素个数 for (int i = 0; i < n; ++i) { int tmp = a[i]; cout << tmp <<原创 2017-09-03 12:08:53 · 5731 阅读 · 0 评论 -
C++11:noexcept修饰符、nullptr、原生字符串字面值
noexcept修饰符void func3() throw(int, char) //只能够抛出 int 和char类型的异常{//C++11已经弃用这个声明 throw 0;}void BlockThrow() throw() //代表此函数不能抛出异常,如果抛出,就会异常{ throw 1;}//代表此函数不能抛出异常,如果抛出,就会异常//C++11 使用noexc原创 2017-09-03 12:14:14 · 4585 阅读 · 0 评论 -
C++11:模板的改进
右尖括号>改进在C++98/03的泛型编程中,模板实例化有一个很繁琐的地方,就是连续两个右尖括号(>>)会被编译解释成右移操作符,而不是模板参数表的形式,需要一个空格进行分割,以避免发生编译时的错误。template <int i> class X{};template <class T> class Y{};int main(){ Y<X<1> > x1; // ok, 编译成功原创 2017-09-03 12:17:15 · 3572 阅读 · 0 评论 -
C++11:类的改进
继承构造C++ 11允许派生类继承基类的构造函数(默认构造函数、复制构造函数、移动构造函数除外)。#include <iostream>using namespace std;//基类class A{public: A(int x, int y) { a = x; b = y; }protected: int a; in原创 2017-09-03 14:51:06 · 2406 阅读 · 0 评论 -
《C陷阱与缺陷》:更新顺序文件
许多系统中的标准输入/输出库都允许程序打开一个文件,同时进行写入和读出的操作:FILE * fp; fp = fopen(file, "r+"); 上面的例子代码打开了文件名由变量 file 指定的文件,对于存取权限的设定表明程序希望对这个文件进行输入和输出操作。编程者也许认为,程序一旦执行上述操作完毕,就可以自由地交错进行读出和写入操作。遗憾的是,事实总是难随人愿,为了保持与翻译 2017-04-06 15:02:59 · 1935 阅读 · 0 评论 -
C++11新特性学习
1、什么是C+11C++11标准为C++编程语言的第三个官方标准,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++。在正式标准发布前,原名C++0x。它将取代C++标准第二版ISO/IEC 14882:2003 - Programming languages -- C++成为C++语言...原创 2017-09-03 15:07:50 · 136182 阅读 · 4 评论 -
protobuf入门教程
1、简介和安装2、消息类型3、proto3 与 proto2 的区别4、常用序列化/反序列化接口5、repeated限定修饰符6、枚举(enum)、包(package)7、导入定义(import)8、protobuf免费教学视频...原创 2017-07-02 11:41:29 · 40891 阅读 · 1 评论 -
Go基础编程:流程控制
Go语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构。顺序结构:程序按顺序执行,不发生跳转。选择结构:依据是否满足条件,有选择的执行相应功能。循环结构:依据条件是否满足,循环多次执行某段代码。选择结构if语句if var a int = 3 if a == 3 { //条件表达式没有括号 fmt.Println...原创 2017-09-24 18:40:44 · 4662 阅读 · 0 评论 -
C++11:强类型枚举
C++ 11引入了一种新的枚举类型,即“枚举类”,又称“强类型枚举”。声明请类型枚举非常简单,只需要在enum后加上使用class或struct。如:enum Old{Yes, No}; // old styleenum class New{Yes, No}; // new styleenum struct New2{Yes, No}; // new style“传统”原创 2017-08-17 20:33:27 · 3986 阅读 · 0 评论 -
C++11:类型推导
autoauto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。从这个意义上讲,auto并非一种“类型”声明,而是一个类型声明时的“占位符”,编译器在编译时期会将auto替换为变量实际的类型。通过auto的自动类型推导,可以大大简化我们的编程工作:#include <iostream>#include <vector>#include <string>using namespace原创 2017-08-21 23:27:21 · 6030 阅读 · 0 评论 -
C++ 闭包(closure)
本文转自:http://www.cnblogs.com/Aion/p/3449756.html什么是闭包闭包有很多种定义,一种说法是,闭包是带有上下文的函数。说白了,就是有状态的函数。更直接一些,不就是个类吗?换了个名字而已。一个函数,带上了一个状态,就变成了闭包了。那什么叫 “带上状态” 呢? 意思是这个闭包有属于自己的变量,这些个变量的值是创建闭包的时候设置的,并在调用闭包的时候,可以访问这些变转载 2017-08-21 09:01:54 · 12940 阅读 · 0 评论 -
C++11:右值引用
左值、右值在C语言中,我们常常会提起左值(lvalue)、右值(rvalue)这样的称呼。一个最为典型的判别方法就是,在赋值表达式中,出现在等号左边的就是“左值”,而在等号右边的,则称为“右值”。如:int b = 1;int c = 2;int a = a + b;在这个赋值表达式中,a就是一个左值,而b + c则是一个右值。不过C++中还有一个被广泛认同的说法,那就是可以取地址的、有名字的就原创 2017-08-14 10:36:09 · 4538 阅读 · 0 评论 -
C++11:移动语义
为什么需要移动语义#include <iostream>using namespace std;class Test{public: Test(int a = 0) {//普通构造函数 d = new int(a); cout << "构造函数\n"; } Test(const Test & tmp) {//拷贝构造函数原创 2017-08-14 10:58:42 · 10825 阅读 · 0 评论 -
C++11:std::function
在C++中,可调用实体主要包括:函数、函数指针、函数引用、可以隐式转换为函数指定的对象,或者实现了opetator()的对象。C++11中,新增加了一个std::function类模板,它是对C++中现有的可调用实体的一种类型安全的包裹。通过指定它的模板参数,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟执行它们。#include <iostream>#include <func原创 2017-08-21 11:00:07 · 6492 阅读 · 0 评论 -
C++11:std::bind
std::bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体,这种机制在回调函数的使用过程中也颇为有用。C++98中,有两个函数bind1st和bind2nd,它们分别可以用来绑定functor的第一个和第二个参数,它们都是只可以绑定一个参数,各种限制,使得bind1st和bind2nd的可用性大大降低。在C++11中,提供了std::bind,它绑原创 2017-08-21 11:30:18 · 14173 阅读 · 1 评论 -
C++11:std::move和std::forward
标准库函数 std::move既然编译器只对右值引用才能调用转移构造函数和转移赋值函数,而所有命名对象都只能是左值引用,如果已知一个命名对象不再被使用而想对它调用转移构造函数和转移赋值函数,也就是把一个左值引用当做右值引用来使用,怎么做呢?标准库提供了函数 std::move,这个函数以非常简单的方式将左值引用转换为右值引用。int a;int &&r1 = a; // 编译失原创 2017-08-14 11:15:12 · 7290 阅读 · 0 评论 -
C++11:lambda表达式
lambda基础使用lambda 表达式(lambda expression)是一个匿名函数,lambda表达式基于数学中的 λ 演算得名。C++11中的lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。lambda表达式的基本构成: ① 函数对象参数 [],标识一个lambda的开始,这部分必须存在,不能省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参原创 2017-08-21 16:55:38 · 7853 阅读 · 1 评论 -
C++11:初始化
类内成员初始化class Mem{public: Mem(int i): m(i){} //初始化列表给m初始化 int m;};class Group{public: Group(){}private: int data = 1; // 使用"="初始化非静态普通成员,也可以 int data{1}; Mem mem{2}; // 对原创 2017-08-22 09:58:34 · 4500 阅读 · 2 评论 -
C语言可变参数的使用
概要众所周知,C++支出函数重载,而C语言默认是不支持。但是,C语言可以通过可变参数实现类似函数重载的功能。如 Linux C 的open()函数,这个函数有2个版本。有一个可选的第三个参数时只需要文件可能被创建。第三个参数描述了使用新文件的权限设置。#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(con原创 2016-12-22 18:45:15 · 23268 阅读 · 0 评论