自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

guxch的专栏

路漫漫其修远兮,吾将上下而求索

  • 博客(110)
  • 资源 (7)
  • 收藏
  • 关注

原创 C++20新特性—span与bind_front

Std::spanspan<T>表示一段连续的内存,像数组一样,但它不拥有或管理这段内存,即它是“view”,大致上就是struct { T * ptr; size_t length; 一组获取内部元素的函数 },所以span具有三个特征:连续内存 轻量级 viewspan的三个特征决定了它主要应用场合包括:C风格的(T *,size_t length)的包装器,这样,对C风格“数组”的操作,可以用C++容器类操作的风格来代替; 类似于string_view对string的作

2021-02-19 09:45:54 579

原创 C++20新特性—数学计算库

数学常数增加了<numbers>,其中定义了常用的数学常数,如e,log2e,sqrt2,sqrt3等。Bit操作新增了一些列bit的操作,如按位判断有几个0,几个1等,具体内容参加库函数说明,用法示意如下(std::bit_cast在gcc10.2中未被支持):...

2021-02-07 09:41:06 160

原创 C++20新特性—格式化文本与串行化输出

text formatting这一部分是对格式化输出的扩展,并增加了std:format一系列函数,感觉与C#相当类似(穿越了?)。对某一类型,其占位符(替换符)的格式如下:{n:arg-id}其中n代表后面参数的index,终于可以占位符的顺序与参数顺序不同了,也可以重复输出某参数了,n也可以是一个名字,绑定后面的参数,以实现命名参数输出,arg-id的规则比较复杂,与原先的format string类似。以下是几个例子:位置对应输出:print("I'd rather be {1}

2021-02-07 09:39:44 331

原创 C++20新特性—时间库

C++11中的时间库有三个基本概念:Duration:表示两个时刻的度量,如时、分、秒都是duration。duration内部是通过count和计量精度(period precision)来衡量duration,其中period precision表示成秒的倍率值(ratio)。 Time point:表达某一特定的时刻点,但实际上,绝对的时刻点是不存在的,因此time point也是由duration来表达的,它是机器上的clock相对于epoch的duration。 Clock:用time p

2021-02-05 10:52:48 179

原创 C++20新特性—consteval与constinit

consteval可用在立即函数(immediate function),立即函数实际上是编译时运行的函数,也就是它的参数在编译时是“确定的”(常量),它的结果也是常量。constexpr可用于编译或运行时函数,它的结果是常量。它们区别如下例,特别注意的是注释掉的那行。using namespace std;consteval int compileconst(int n) { return n+1;}constexpr int runcompileconst(int n) { return n

2021-02-04 13:35:13 558

原创 C++20新特性—三路比较符<=>

集合(set,map等)算法通常会涉及元素比大小,因此两个元素(类型)的比较操作就显得额外重要。两个类型之间的共有六种比较符(<,<=,>,>=,==,!=),如果需要完整的表达,就要写六个函数,如果需要与可转换类型比较,这项工作显得比较繁琐,因此这也是C++引入<=>的基本初衷。【如果认为用一个比较符,例如”<”就可以推导出另外几个,其实这只适用于一些场景,这也是C++引入新的比较操作符的另一个原因。】<=>称为3-way comparison o

2021-01-29 13:46:33 340 1

原创 C++20新特性—range(二)

6.viewview是一种range,它具有固定的拷贝、移动和赋值时间,正如名称所示,view是“视图”(引用),它本身不保存数据,因而可以保证复制等操作的等时间性。view一个重要的特征是“lazy evaluation”,即它在被定义的时候,仅将各种参数准备好,并没有运算,只有需要结果的时候,它才开始进行运算,得到结果。这个特性与数据库中的视图概念是一致的。下面的示例说明了“lazy evaluation”的特性。 std::vector<int> ints{0,1,2,

2021-01-28 15:44:43 500

原创 C++20新特性—range(一)

“Ranges”的意思是一组元素的集合,既然是集合,最基本的操作就是对其中元素的枚举(iterate),按照一个集合是否可读写以及如何进行枚举,集合可分为以下几类(以concept形式体现)

2021-01-28 14:02:20 931

原创 C++20新特性—coroutine协程(二)

下面一个示例说明co_await 的用法。template<class T>struct generator{ struct promise_type { std::suspend_never initial_suspend() const noexcept { std::cout<<"initial_suspend"<<std::endl; return {}; } std::suspend_never final_suspend()

2020-12-24 09:34:23 360 1

原创 C++20新特性—coroutine协程(一)

所谓“协程”,简单点说就是一个函数可以中止运行,待“条件成熟”后,再次在断点的地方重新运行,即能以“进入-暂停-继续-暂停…”这样的方式运行函数,因此讨论协程,需要关心下面几个问题:在运行点暂停,然后再运行—暂停点的记录 暂停时的运行环境,恢复运行时,应首先恢复当时的环境—运行环境的记录 因协程状态是变化的,因此需要有办法查询协程当前的运行状态,包括返回值、异常等—协程状态的记录异步操作是 “慢”资源与“快”资源协调编程方面的一个“老”问题,协程的目标就是试图以“同步的形式”编写出异步操作的效果。

2020-12-23 14:56:44 802

原创 C++异步操作中的future/promise

std::future、std::promise是在C++11中出现的类,定义在<future>中,在C++20以前,异步操作主要依靠它们以及其它一些类、函数等来完成。C++20中引入了coroutine,从语言层面而不仅是实现方法层面实现异步操作,但coroutine中也涉及到std::future等对象,因此需要先理解一下这些C++11就出现的类,下一篇再介绍C++20的coroutine。std::futurestd::future可以保存某一操作(函数)的结果,因而也可以用来在不

2020-12-21 10:32:51 136

原创 C++20新特性—线程支持库

C++20线程库增加的内容主要包括两方面:jthread及相关的stop_token等;用于线程同步的semaphore、latch等。一、joinable和stoppable的jthread1. jthreadstd::jthread也在<thread>中定义,基本与std::thread相同,不同在于:在析构时,自动join到主线程,此时写法上比单纯用sth::thread简洁些 可以在线程外终止此线程的执行,jthread内部有一个std::stop_source对象,而

2020-12-08 14:32:38 196

原创 C++20新特性—模板类型约束(concept)

模板编程中,类型是一种输入参数,对某一具体模板类,多数情况下,并不是所有的类型都适合,类型必须符合某种要求,模板类型约束就是在编译期,用于限制模板参数。其实在C++11的type_traits中,就有很多类似于is_const、is_base_of、enable_if、conditional这样的类型判断,类型选择,类型操作等函数,它们在编译期施加到类型参数上,起到了类型限制等作用。C#中,早就引入where关键字,来进行泛型约束。这里C++中也为此引入两个关键字requires和concept,将类型

2020-12-08 09:31:33 1559 1

原创 C++20新特性—module

模块概念是现代编程语言的一大特征,目的是将大型程序分割成合适的部分(包括复用),再通过相关规则组合起来。C/C++一直采用.h文件的方式,将函数/类型声明与它们的实现分开,这种方式大致上有三个问题:重复、循环包含问题(虽然ifndef等可以解决此问题,但并不方便)。 函数声明与实现分开,函数类型说明一般需要写两遍,修改时不方便。 模板的引入,使得大量代码只能在.h中编写,整个程序的编译速度变慢(尤其存在大量模板类的场景)。在这方面,C#,java中模块定义、引入机制要简洁、方便得多。Modules

2020-12-07 15:54:11 571

原创 C++20新特性—概述

ISO / IEC 14882:2020(即C++20标准)标准草案在2020年9月获得了全票通过,年底能正式发布。对C++20,多数的评论是它具有可与C++11相比较的重大变化。下图是Rainer Grimm博文中给出的C++20的主要变化。其实,一门编程语言的变化大致上是应该分两个层面,一个是语言层面,即增加了语言新特性;二是库层面,其实就是各种“语法糖”等,它们是在语言层面的基础上扩展、实现出来的,使用起来更“接地气”。cppreference 网站也给出了C++20的主要变化(htt

2020-12-07 10:31:25 1987

原创 Libuv应用(二)

三、TCP/UDPLibuv最常用的应用是TCP和UDP通信。它们是libuv的主要功能,但有很多文章都描述了,本文就不涉及了。四、人工通知事件一般情况下,一个线程运行一个事件循环,线程阻塞,等待事件的发生,如果我们想“干预”一下这个事件循环,例如,停止它,向某个socket通道发点信息等,就需要人工“制造”一个消息触发一次,此时就需要用到uv_async_t。由于事件循环的线程处于阻塞状况,所以发消息的函数应该在另一个线程。下面是一个示例。int test_async(){ int

2020-11-04 09:20:52 158

原创 Libuv应用(一)

笔者写过libevent及boost.asio的有关介绍,另一个网络库libuv也得到广泛应用,似乎应该把libuv的介绍补上,因此就有了本文,本文仅是对libuv的一个大概描述,细节应该参考其官方文档(http://docs.libuv.org/en/v1.x/api.html),这也是本文的主要参考依据。本文涉及libuv对应的版本为1.39.0,例子的运行环境为windows10。一、libuv各种结构表1 各种核心结构 用于消息循环的各种核心结构,libuv的主要功能就从这些结构.

2020-11-03 08:58:50 188

原创 Redis Stream使用要点

本文的适用于Redis6.0。一、流信息条目id流(stream)中信息条目的ID必须是单调增的,为此,redis采用时间戳+自增id这种方式来保证,并且这两个数都是64bit,不会有溢出问题,最后一点,redis在增加信息条目时会检查当前id与上一条目的id,自动纠正错误的情况,一定要保证后面的id比前面大。一个流中信息条目的ID必须是单调增的,这是流的基础,所以本文首先强调一下。几个特殊的ID:-,+:最小和最大可能出现的Id,也就是“0-1”和“最大整数-最大整数(64位)”$

2020-07-10 16:56:35 691

翻译 Redis Streams介绍(二)

从永久故障中恢复 上面的例子允许我们向加入到同一使用者组的成员发送信息,处理各自的消息子集,并从故障中恢复,继续读取曾经发送过来的、被挂起的消息。但是,在现实情况,使用者可能发生永久故障而不再恢复,那么对不知何故不再恢复的使用者,那些挂起的信息怎么办呢? 在这种情况下,Redis提供了一个方法,用以回收特定用户的挂起信息,改变它们的所有权,将它们分配给另一个不同的用户。这个特性的目标非常明确,使用者必须能检查挂起的信息列表,并可以用一个特别的命令来获取这些特定信息的所有权...

2020-07-09 08:41:54 230

翻译 Redis Streams介绍(一)

(原文发布于https://redis.io/topics/streams-intro,对应redis6.04,本文已完成大半,忽然发现网上已有翻译文章,但还是按自己的理解完成文章的翻译。原文较长,原想将英文也附上,好对照,但确实太长了,终省去。) “流”是Redis5.0引入的新的数据类型,它的模型来自于日志数据,以一种更加抽象的方式,但日志的基本特征没有变化:通常像一个以只增加方式打开的文件。Redis流基本上就是一个只添加方式的数据结构。至少在概念上,作为一种在内存里展现的抽象的数据...

2020-07-08 09:10:57 300

原创 Boost Beast要点解析(四)

四、Beast中的network 由于http、websocket仅涉及tcp,因此在beast范围内,也仅涉及tcp协议,Beast的网络操作基于Asio,但Beast的一个目标似乎是做一个完整的系统(猜测),因此beast将涉及到的网络数据操作都“重写”的一遍(一些是简单包装,一些是扩展),例如Asio空间被重新命名为net,对std:bind也扩展为bind_handler和bind_front_handler。 beast设计了两套stream,一是用于http的...

2020-06-18 09:16:58 1976

原创 Boost Beast要点解析(三)

三、Beast中的http request和response 在beast文档中,专门解释了是如何构思http request和response类的。Request和response的定义如下:template<bool isRequest, class Fields, class Body>class message:public header<isRequest, Fields>,boost::empty_value<typename Body::...

2020-06-17 08:38:36 1659

原创 Boost Beast要点解析(二)

5.static_bufferstatic_buffer的定义如下:template< std::size_t N>class static_buffer : public static_buffer_base static_buffer可认为是max_size在编译时就已确定,因此内存大小固定,不会发生重新分配。基类static_buffer_base引用外部分配的内存,定义了一系列操作,static_buffer则分配了一段内存,其操作方法与基类基本一致(多了b...

2020-06-16 09:14:18 1077

原创 Boost Beast要点解析(一)

【注】本文不是关于beast的全面描述,只涉及一些要点,主要资料来源于beast官方文档和实现代码。本文对应boost 的版本为1.73。一、Beast中的Buffer

2020-06-15 16:30:29 3866

原创 C++17标准库新增类/函数(二)

 std::apply,std::invokestd:apply定义在&lt;tuple&gt;中,因而apply(f,t)的意思就是f(t),其中f是一个可调用的函数,t是一个tuple,pair,array之类的可以调用std::get和std::tuple_size的参数集合类。#include &lt;iostream&gt;#include &lt;tuple&gt;#in...

2018-11-30 15:04:45 1149

原创 C++17标准库新增类/函数(一)

std::FilesystemC++17中的filesystem库基本上与Boost.Filesystem相同。C语言库中有许多对文件的操作,但一直没有对目录及文件属性的操作。C++17中终于加入,主要包括以下内容:对文件系统的操作:path类,空间信息对目录的操作:创建,删除,属性,遍历目录的iterator等对文件整体的操作:删除,拷贝,属性,类型判断等。这些操作,是对以前...

2018-11-30 14:58:24 1679

原创 Boost Asio要点概述(三)

五、流式操作许多IO对数据的操作是按流式来进行的,为此Asio提供了流式操作,如上面的streambuf。对最典型的是TCP流,提供了ip::tcp::iostream。下例是一个简单的示例。void iostreamclient(int argc , char* argv[]){ boost::asio::ip::tcp::iostream stream; stream.expi...

2018-10-29 17:23:21 1894

原创 Boost Asio要点概述(二)

三、多任务执行复杂一些的应用,往往存在多个事件任务执行,此时既有可任意顺序执行的场景,也有按指定顺序执行的场景,前者可采用将任务放到多个线程执行,后者要用到”strand”概念。1.多线程支持Boost中io_context是支持多线程的,其内部有一个队列来分配待运行的句柄函数,对服务器端程序来说,这减轻了我们采用多线程同时执行任务的难度,虽然我们不能控制任务在多个线程进行分配的策略。...

2018-10-29 10:05:57 2531 2

原创 Boost Asio要点概述(一)

【注】本文不是boost asio的完整应用讲述,而是仅对其中要点的讲解,主要参考了Boost Asio 1.68的官方文档(https://www.boost.org/doc/libs/1_68_0/doc/html/boost_asio/overview.html),代码的测试环境为ubuntu 18.04,asio的编译及安装不在本文的范围之内。一、基本工作流程下图来自boost a...

2018-10-29 10:01:30 14933 3

原创 Boost中的协程—Boost.Asio中的stackful协程

Boost.asio中stackful协程是由Boost::Asio::spawn开启的,文档说,spawn是协程的一种高层次的封装,spawn由许多版本,多用以下定义:template&lt; typename Function&gt;void spawn( const boost::asio::io_context::strand &amp; s, Functi...

2018-09-21 17:03:01 2214

原创 Boost中的协程—Boost.Asio中的coroutine类

Boost.Asio中有两处涉及协程,本文介绍其中的coroutine类。Boost.Asio中的stackless协程是由coroutine类和一些宏来实现的。coroutine类非常简单,包括四个函数,一个int类型变量,用来保存当前函数的运行状态,与之配合使用的宏中,因采用switch来实现,所以可以根据这个整型变量的值实现跳转。Boost.Asio定义了一些宏,构成所谓的“伪关键字...

2018-09-21 16:53:24 3142

原创 Boost中的协程—Boost.Coroutine2

尽管可以有不同的翻译,coroutine本文被叫作协程。概念Coroutine是相对于routine(过程)而提出的,它与一般的父程序调用子程序的routine不同之处在于,它允许挂起一个程序执行点,过后再从挂起的地方继续运行,是一种更高级的程序运行顺序控制。为保证程序挂起再恢复,协程有其自己的栈和控制块,记录挂起时的状态。协程有如下特点:同其他数据类型一样,协程也是第一类(fir...

2018-09-21 16:44:06 8937

翻译 Boost.Asio初步(三)

Platform-specific I/O ObjectsSo far, all of the examples in this chapter have been platform independent. I/O objects such as boost::asio::steady_timer and boost::asio::ip::tcp::socket are supported ...

2018-09-05 15:59:48 491

翻译 Boost.Asio初步(二)

Network programmingEven though Boost.Asio can process any kind of data asynchronously, it is mainly used for network programming. This is because Boost.Asio supported network functions long before a...

2018-09-05 15:40:17 1267

翻译 Boost.Asio初步(一)

【注】本翻译来自https://theboostcpplibraries.com/boost.asio。boost.asio从v1.66起io_service变成了io_context,二者有一定差异,但基本应用相同。目  录IO服务和IO对象 可扩展性和多线程 网络编程 协程 与平台相关的IO对象This chapter introduces the library Boost...

2018-09-05 15:20:50 5034

原创 Tornado开发(六)— 扩展

5. 多进程部署多进程部署也有两种方式:一是利用tornado自带的启动多个进程的方式,二是利用Nignx在前面做负载均衡的方式。tornado自带方式测试代码如下:class LongHandler(tornado.web.RequestHandler): def get(self): stime=time.strftime('%Y-%m-%d %H:%M:%S',time.localti...

2018-07-03 09:15:10 650

原创 Tornado开发(五)— 扩展

4. 协程异步/多线程处理以协程方式(Coroutine)进行异步处理,是Tornado推荐的方式。Coroutine不采用回调函数方式,而用yield来挂起和恢复运行(现在又有新关键字了,说明python的Coroutine还没有稳定下来),协程编程风格看起来像同步,但又没有线程的切换,因此效率要高一些。在Tornado中,现在有两种方式实现协程:一是函数前加@tornado.gen.corou...

2018-07-02 09:22:59 954 1

原创 Tornado开发(四)— 扩展

2.  页面的Session检查Web应用中,各页面实际上是没有关系的,但为了给用户“完整”的感觉,需要用一个Session对象将用户访问的各页面“串”起来,同时,某些信息比较敏感,不希望被“窃听”或“修改”,因此,在每一页被访问时,通常的的做法是首先检查Session对象,以确定访问者的身份。有许多种方法可以实现上面的逻辑,例如,数据可缓存在浏览器或服务器中,对敏感数据采用特别的加密解密方式等。...

2018-06-26 10:41:29 604

原创 Tornado开发(三)— 网页模板 及扩展

6. 多语言支持(Internationalization)作为一款web开发框架,国际化是必不可少的,虽然只做国内网站时没啥用。如果需要做一个多语言支持的网页,首先要准备多语言翻译文件,tornado支持两种格式的翻译文件:po/csv,csv更简洁些,下面以此为例来说明。csv文件的格式为(三列):字符串,翻译,”plural”/“singular”,最后一列表明此翻译为单数时用还是复数时用,...

2018-06-26 10:35:28 923

原创 Tornado开发(二)— 网页模板

四. 网页模板最终呈现给用户的html页面,一般是由静态信息与动态信息合成的,静态信息与用户等应用环境无关,动态信息则与用户、场景相关,多是从数据库中取得数据后加工得到的。在tornado中,保存在服务器端的包含动态信息的文件叫模板(template),模板文件被request handler载入并处理,即替换其中的动态信息,变成符合要求的html文档发给客户。Tornado 会把模板文件编译成原...

2018-06-26 10:10:41 2186

Windows平台的包含源代码的libevent(可编译)

将网上的libevent源代码的引用关系修改了一下,使所有的.h .c文件位于一个目录,可以采用代码级包含到项目中,也可以供分析libevent运行机制之用。 注:未包含项目文件,只适合于windows,自行创建vc项目后,包含所有文件(arc4random.c除外)。

2013-01-08

C#小型图形绘制库源代码

c#开发的一个小型图形绘制库,详见本人文章《Silverlight学习-创建一个信息系统中趋势曲线图库(二)》

2011-07-23

Windows下的flex和bison

Windows下的flex和bison,用于编程辅助

2013-09-16

一个firefox OS App的例子

一个最简单的firefox OS App的例子,详细内容请参见作者博文。

2013-03-08

apache2.4 php5.4手工安装包.zip

apache2.4和php5.4的手工安装包(包括其依赖包),全部从官网下载,x64,Debian等操作系统适用,可供手工离线安装,mysql5.6的包太大了,不能上传,不过其官网提供deb包,直接下载安装即可。

2013-05-14

IronPyhton 2.7.1 帮助手册

IronPyhton 2.7.1 帮助文档

2011-09-01

gcc编译动态和静态链接库

转载的gcc编译方法,开发时老是忘记,作为资源吧,省得找了。

2013-02-10

空空如也

空空如也

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

TA关注的人 TA的粉丝

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