
C/C++
文章平均质量分 73
china_jeffery
持续学习者;
擅长开发开源组件及相关工具;
长期致力于应用各种IT新技术提升生产效率和解决实际问题;
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
如何实现一个高速文件下载器
我们从网络上下载文件时通常会使用浏览器或者迅雷这样的下载软件,他们的大多具有高速下载(下载速度快),断点续传(可以暂停之后继续下载)等特性。假如我们自己开发的应用软件中也需要支持这些下载功能,我们该如何设计和实现了?本文主要围绕这一问题进行论述。首先,我们将一个完善的文件下载库需要具有的特性列举出来:多线程分片下载断点续传磁盘缓存最高下载速率限制及实时下载速率反馈(可选)多协议支持,跨平台(可选)1. 多线程分片下载Chrome浏览器和迅雷能实现高速下载的核心就是多线程分片下载(这里忽略原创 2020-07-09 11:28:37 · 1659 阅读 · 0 评论 -
《C++ API设计》摘录
《C++ API设计》是一本非常不错的书,该书内容远远超过了它标题所指的C++ API设计,它不仅仅讲述了与编程语言无关的API设计需要遵循的一些规范,同时也介绍了很多C++开发中需要遵守一些准则,如果在开发中能遵循这些准则,将有利于我们写出高质量的代码。 … 本文将该书中我认为比较受用的部分摘录下来。只有两种编程语言:一种是天天挨骂的,另一种是没人用的。良好的API设...原创 2018-01-27 17:59:34 · 78321 阅读 · 3 评论 -
C++虚函数表的应用
我们知道在C++中要调用类的私有方法,我们可以使用友员(friend)的方式。但其实如果我们知道类的定义,完全可以根据该类对象的内存布局来直接调用它的私有函数。本文作为“C++虚函数实现原理”的后续文章,并不打算介绍类的内存布局,本文只介绍如何使用虚函数表的方式来调用该类的私有虚函数。在阅读本文前需要先了解C++虚函数的实现原理,可以先参考:http://blog.youkuaiyun.com/chi...原创 2018-02-11 23:11:26 · 69605 阅读 · 1 评论 -
从汇编的角度分析函数调用过程(1)
一. 函数参数传递形式函数的参数传递有2种方式:堆栈方式、寄存器方式。 如果是堆栈方式传递的,就需要定义函数参数在堆栈中的传递顺序,并约定函数被调用之后,由谁来平衡堆栈; 如果是寄存器方式传递的,就需要确定参数存放在哪个寄存器中。 每一种方式都有其优缺点,而且与使用的编程语言有关系,不存在哪种方式好与坏。我们在开发中经常遇到调用约定类型,如__cdecl、stdcall、PASCAL...原创 2018-02-12 11:08:53 · 71841 阅读 · 0 评论 -
C++构造函数初始化列表
一. 何为构造函数初始化列表class Sample {public: // 构造函数内部赋值 Sample(int a) { a_ = a; } // 构造函数初始化列表 Sample(int a) : a_(a) { }private: int a_;};上面的代码中,Sample类的2个构造函数的...原创 2018-02-07 19:52:47 · 66885 阅读 · 1 评论 -
C++默认构造函数
本文围绕3个问题来理解C++的默认构造函数:什么是默认构造函数?默认构造函数什么时候被调用?编译器在什么情况下会生成默认构造函数?一. 什么是默认构造函数?我们一般会认为默认构造函数就是编译器自动生成的那个构造函数,其实这种理解不全面。 准确的说,默认构造函数就是在调用时不需要显示地传入实参的构造函数。根据这个原则,下面2种构造函数都是默认构造函数:class S...原创 2018-02-08 12:43:51 · 81687 阅读 · 4 评论 -
C++11 智能指针
C++11标准库中提供的智能指针主要有:std::auto_ptr, std::unique_ptr, std::shared_ptr。 std::auto_ptr在C++11中已经标记为弃用,而在C++17中就完全移除了,不建议使用std::auto_ptr。头文件:#include <memory>using namespace std;现有如下测试类:...原创 2017-11-24 15:14:03 · 86930 阅读 · 0 评论 -
C/C++基础概览
(1) sizeof在32位系统下,各类型所占字节数sizeof(char) = 1sizeof(short) = 2sizeof(int) = 4sizeof(unsigned int) = 4sizeof(long) = 4sizeof(long long) = 8sizeof(float) = 4sizeof(double) = 8数组的大小ch...原创 2018-03-03 19:11:47 · 49432 阅读 · 0 评论 -
大端(Bid Endian)、小端(Little Endian)含义
一、 大小端概念Big-Endian和Little-Endian的定义如下:Little-Endian 数据的低位字节位存放在内存的低地址端,高位字节存放在内存的高地址端。Big-Endian 数据的高位字节位存放在内存的低地址端,低位字节存放在内存的高地址端。二、 实例分析比如十六进制数字0x12345678,它总共占4个字节(1个字节8位,2个16进制占8位,所以1个字节最大表示0xFF)。这...原创 2017-10-31 11:42:33 · 89592 阅读 · 0 评论 -
windows平台libcurl+openssl编译备忘
一、环境准备Visual Studio 2015(其他版本也可以)GitPerlCMake二、开始编译2.1 获取curl源码:git clone --branch curl-7_60_0 https://github.com/curl/curl.git2.2 获取openssl源码:Git获取指定版本的源码,因为7_60_0版本libcurl自带的bui...原创 2018-06-06 00:39:41 · 13645 阅读 · 1 评论 -
C++内存池技术
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。 一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一方面,频繁的分配和释放小块内存会导致大量的内存碎片的产生,当碎片积累到一定的量之后,将无法分配到连续的内存空间,系统不得不进行碎片整理来满足分配到连续的空间,这样不仅会导致系统性能损耗,而且会导致...原创 2018-06-20 18:04:03 · 12132 阅读 · 2 评论 -
C++11 Lamada表达式
Lamada表达式是C++11最重要也是最常用的特性之一。Lamada来源于函数式编程的概念,也是现代编程语言的一个特点。Lamada表达式定义下图展示出了C++ Lamada表示的组成部分: 其中: ① 指明捕获列表 ② 指明参数列表 ③ mutable可选项。和常规的mutable用法类似,即当lamada表达式参数是const时,使用mutable可以取消这种cons...原创 2018-06-22 11:17:25 · 978 阅读 · 0 评论 -
使用C++生成条形码
一、条形码介绍条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。条码种类很多,常见的大概有二十多种码制,其中包括:Code39码(标准39码)、Codabar码(库德巴码)、Code25码(标准25码)、ITF25码(交叉25码)、Matrix25码(矩阵...原创 2018-09-21 12:57:31 · 9583 阅读 · 3 评论 -
使用NuGet管理C++项目的依赖库
一、NuGet介绍使用C++进行开发的同学,一定很羡慕Python的pip、Java的Maven等包管理器,只需要一个命令就可以将工程需要的依赖库安装到位。由于C++的大多数库都是系统、编译环境强相关联的,所以在开发中我们会针对不同的操作系统(Win32、Win64等)、编译器(MSVC140、MSVC120等)编译出对应的静态库或者动态库,然后配置头文件包含目录、库引用目录、预编译宏等等。...原创 2019-01-10 18:40:25 · 9672 阅读 · 0 评论 -
Windows Console彩色进度条
我们在进行命令行程序开发的时候,经常会遇到显示一个进度条,如下载进度等,现在提供一个封装好的在命令行中显示彩色进度条的函数:#include <windows.h>void ShowConsoleProcess(double percentage) { const char* PBSTR = "========================================...原创 2019-05-30 11:12:28 · 995 阅读 · 0 评论 -
C++虚函数的实现原理
一. 虚函数介绍C++中的虚函数主要是用来实现多态(面向对象的三大特性之一)的。 下面是一个实现多态的错误例子:// 基类//class Base {public: Base() { printf("Call Base::Base()\n"); } ~Base() { } void Name() { ...原创 2017-11-08 22:49:34 · 84142 阅读 · 0 评论 -
C++ Thunk技术
一. 使用回调函数时遇到的问题在使用Win32 API(如CreateThread等)时我们经常需要传入回调函数,这个回调函数不能是类的成员函数,只能是友元函数或静态函数。为了在回调函数中访问某个类的成员变量或函数,我们通常不得不通过某种方式将该类的This指针传入到回调函数中,从而实现在回调函数中访问类的公有的成员变量或函数。如果有一种方式可以实现将类的成员函数作为回调函数来使用,那么就...原创 2018-02-26 11:05:19 · 54828 阅读 · 1 评论 -
从汇编的角度分析函数调用过程(2)
#include <stdio.h>int add(int a, int b) { int c = 0; c = a + b; return c;}int main(){ int r = add(1, 2); return 0;}我们使用Visual Studio 2017编译上面代码,并在在工程配置中将函数调用约定设置为_...原创 2018-02-12 16:56:22 · 74862 阅读 · 1 评论 -
C++软件开发中“时间”相关操作全攻略
1. 时间概念在日常生活中我们遇到的和时间相关的概念有北京时间、时差、12小时制、24小时制等,在软件开发中我们也经常遇到和时间相关的概念,软件虽说是一个虚拟的事物,但它仍然是来源于生活,不会脱离生活。我们在开发中遇到的时间概念大多可以对应上日常生活中的时间概念,但也有一些是软件作者(如微软等)人为制造的一些概念,如系统时间、文件时间等。格林威治时间(UTC Time)本初子午线原创 2017-11-01 00:04:42 · 83388 阅读 · 0 评论 -
C++ Windows平台字符串编码转换
一、Windows API本文介绍使用Windows API进行字符编码的转换,涉及WideCharToMultiByte和MultiByteToWideChar2个API,API接口名中的MultiByte对应着多字节编码,如ASCII、UTF-8等都是多字节编码,而WideChar字面意思是宽字符,在windows内部宽字符特指UTF-16编码。 原型如下:int WideCh原创 2017-11-01 00:38:23 · 84201 阅读 · 0 评论 -
MSVC编译器Warnings手册
Warning NumberDescriptionC6001warning C6001: using uninitialized memory C6011warning C6011: dereferencing NULL pointer C6029warning C6029: possibl原创 2017-11-09 10:59:40 · 1718 阅读 · 0 评论 -
__declspec(noreturn)使用
__declspec(noreturn)用于告知编译器该函数没有返回值。使用__declspec(noreturn)声明的函数中,不允许出现return。否则会有警告:warning C4645: 用 "noreturn" 声明的函数具有 return 语句原创 2017-11-10 15:21:33 · 1009 阅读 · 0 评论 -
C/C++ enum class枚举类型
声明枚举类型的方式有2种:1. 常见的enum方式enum A { a0 = 0, a1 = 1};enum B { b0 = 0, b1 = 1};2. enum class 方式enum class CC { cc0 = 0, cc1 = 1};enum和enum class的区别如下:1. 使用方式enum声明的枚举可以直接使用枚举原创 2017-11-10 15:40:33 · 85779 阅读 · 0 评论 -
C++ 类型转换
static_cast只提供编译时的类型检查,没有运行时类型检查。完全不相干类型之间的转换是不允许的,编译器会报错。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;虽然也允许进行下行转换(把基类指针或引用转换成子类表示)时,但由于没有动态类型检查,所以是不安全的。用于基本数据类型之间的转换,支持占用不同存储空间的基本类型的转化,但这种转换的安全性也要开发人员来保证。支持vo...原创 2017-12-11 14:10:15 · 88516 阅读 · 0 评论 -
标准库std::min/std::max与min/max宏冲突
如题,因为windef.h中定义了max和min宏:#ifndef NOMINMAX#ifndef max#define max(a,b) (((a) > (b)) ? (a) : (b))#endif#ifndef min#define min(a,b) (((a) < (b)) ? (a) : (b))#endif#endif /* NOMI原创 2017-12-14 12:04:47 · 99534 阅读 · 0 评论 -
C++容器--std::set
一、介绍std::set集合的元素具有顺序性、唯一性等特性,可以指定比较函数进行排序。std::set和std::map一样以红黑树来实现。set成员函数和非成员函数可以参考: http://zh.cppreference.com/w/cpp/container/set二、示例#include <stdio.h>#include <set>#include <memory>class Car原创 2017-12-06 12:41:58 · 88826 阅读 · 0 评论 -
freopen实现标准流重定向到文件
标准流指的是:标准输入流stdin、标准输出流stdout、标准错误流stderr。 freopen可以实现流的重定向,把预定义的标准流重定向到指定的文件中。FILE * freopen ( const char * filename, const char * mode, FILE * stream );使用方法如下:int _tmain(int argc, _TCHAR* argv[]){原创 2017-12-27 23:00:10 · 82506 阅读 · 1 评论 -
Google C++编程规范
个人认为google的C++编码规范实用性强,相较于微软的编码规范更加简单明了.一、文件命名文件名要全部小写,可以包含下划线(_)或短线(-)。my_useful_class.ccmy-useful-class.ccmyusefulclass.cc二、类型命令类型命名每个单词以大写字母开头,不包含下划线:MyExcitingClass、 MyExciti...原创 2017-12-27 23:07:24 · 82657 阅读 · 2 评论 -
C++ 匿名对象
在webRTC的源码中有如下函数:template T>std::unique_ptr WrapUnique(T* ptr) { return std::unique_ptr(ptr);}该函数不复杂,但重点在于它直接返回了一个std::unique_ptr。我们知道std::unique_ptr是不能够直接拷贝构造的,如:std::unique_ptr::string原创 2017-12-25 16:01:42 · 95902 阅读 · 0 评论 -
C++ 编译时断言检查
一、 static_assertC++自C++11起支持static_assert编译时断言,static_assert ( bool_constexpr , message ) (C++11 起)static_assert ( bool_constexpr ) (C++17 起)若 bool_constexpr 返回 true ,则此声明没有效果。否则发布一个编译原创 2017-11-13 16:19:18 · 85557 阅读 · 0 评论 -
C++11 右值引用&&
一、 新特性的目的右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。它的主要目的有两个方面: 1. 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。 2. 能够更简洁明确地定义泛型函数。原创 2017-11-13 14:43:33 · 95429 阅读 · 4 评论 -
MD5
一、MD5介绍MD5是MD5消息摘要算法的简称(英语:MD5 Message-Digest Algorithm),是一种广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(即哈希值),用于确保信息传输的完整性。MD5由罗纳德·李维斯特设计,于1992年公开,用以取代MD4算法。这套算法的程序在RFC 1321 中被加以规范。 将数据(如一段文字)运算变为另一固定长度值,是散列原创 2017-12-13 10:35:53 · 96111 阅读 · 1 评论 -
C++生成Dump文件
C++开发的应用程序避免不了各种崩溃,空指针,野指针,栈溢出等等。为了方便定位问题,我们一般在程序崩溃的时候自动生成一个dump文件,然后通过dump文件结合pdb来定位问题。c++生成dump文件的代码网上有很多,但大多使用起来不那么方便;通过本文介绍的方法只需要使用2个宏就可以实现自动生成dump的功能。代码包含中将EasyDump.h和EasyDump.cpp文件中:原创 2017-11-01 15:01:53 · 86100 阅读 · 0 评论