- 博客(117)
- 资源 (7)
- 收藏
- 关注
原创 openssl中BIO的使用
本文主要介绍了BIO的结构和使用方法,并以示例方式给出了一种对BIO的封装,可为下一步与socket的相关操作结合,编写自定义的“加密/解密流”。
2025-05-09 15:36:40
904
原创 pyorch中tensor的理解与操作(二)
bmm大概是pytorch针对大量应用的batch个二维矩阵集(相当于3维矩阵)乘法的一种扩展,A,B的shape分别为为(b,l,m),(b,m,n),相乘后的shape为(b,l,n),这种乘法相当于首先把A拆成b个(l,m)矩阵,B拆成b个 (m,n)矩阵,A中第i个矩阵与B中对应的第i个矩阵相乘,然后再将b个结果矩阵合起来。关于多维矩阵的转置,例如第2,3维度转置,将第3维之后的维度看成一个整体,第2维之前的维度不用理会(指转置前后不会发生变化),那么就相当于二维矩阵(第2,3维度)的转置。
2025-05-08 19:54:43
944
原创 pyorch中tensor的理解与操作(一)
tensor 是PyTorch 中一个最基本的数据集合类型, 本文注意针对该结构类型,说明它的存储方式以及主要的操作方法。
2025-05-08 19:54:20
822
原创 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
2657
原创 C++20新特性—数学计算库
数学常数增加了<numbers>,其中定义了常用的数学常数,如e,log2e,sqrt2,sqrt3等。Bit操作新增了一些列bit的操作,如按位判断有几个0,几个1等,具体内容参加库函数说明,用法示意如下(std::bit_cast在gcc10.2中未被支持):...
2021-02-07 09:41:06
1031
原创 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
1433
原创 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
1089
原创 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
4432
原创 C++20新特性—三路比较符<=>
集合(set,map等)算法通常会涉及元素比大小,因此两个元素(类型)的比较操作就显得额外重要。两个类型之间的共有六种比较符(<,<=,>,>=,==,!=),如果需要完整的表达,就要写六个函数,如果需要与可转换类型比较,这项工作显得比较繁琐,因此这也是C++引入<=>的基本初衷。【如果认为用一个比较符,例如”<”就可以推导出另外几个,其实这只适用于一些场景,这也是C++引入新的比较操作符的另一个原因。】<=>称为3-way comparison o
2021-01-29 13:46:33
4290
2
原创 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
2143
原创 C++20新特性—range(一)
“Ranges”的意思是一组元素的集合,既然是集合,最基本的操作就是对其中元素的枚举(iterate),按照一个集合是否可读写以及如何进行枚举,集合可分为以下几类(以concept形式体现)
2021-01-28 14:02:20
5675
原创 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
1573
1
原创 C++20新特性—coroutine协程(一)
所谓“协程”,简单点说就是一个函数可以中止运行,待“条件成熟”后,再次在断点的地方重新运行,即能以“进入-暂停-继续-暂停…”这样的方式运行函数,因此讨论协程,需要关心下面几个问题:在运行点暂停,然后再运行—暂停点的记录 暂停时的运行环境,恢复运行时,应首先恢复当时的环境—运行环境的记录 因协程状态是变化的,因此需要有办法查询协程当前的运行状态,包括返回值、异常等—协程状态的记录异步操作是 “慢”资源与“快”资源协调编程方面的一个“老”问题,协程的目标就是试图以“同步的形式”编写出异步操作的效果。
2020-12-23 14:56:44
2702
原创 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
775
原创 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
1464
原创 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
7504
1
原创 C++20新特性—module
模块概念是现代编程语言的一大特征,目的是将大型程序分割成合适的部分(包括复用),再通过相关规则组合起来。C/C++一直采用.h文件的方式,将函数/类型声明与它们的实现分开,这种方式大致上有三个问题:重复、循环包含问题(虽然ifndef等可以解决此问题,但并不方便)。 函数声明与实现分开,函数类型说明一般需要写两遍,修改时不方便。 模板的引入,使得大量代码只能在.h中编写,整个程序的编译速度变慢(尤其存在大量模板类的场景)。在这方面,C#,java中模块定义、引入机制要简洁、方便得多。Modules
2020-12-07 15:54:11
1411
原创 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
5706
原创 Libuv应用(二)
三、TCP/UDPLibuv最常用的应用是TCP和UDP通信。它们是libuv的主要功能,但有很多文章都描述了,本文就不涉及了。四、人工通知事件一般情况下,一个线程运行一个事件循环,线程阻塞,等待事件的发生,如果我们想“干预”一下这个事件循环,例如,停止它,向某个socket通道发点信息等,就需要人工“制造”一个消息触发一次,此时就需要用到uv_async_t。由于事件循环的线程处于阻塞状况,所以发消息的函数应该在另一个线程。下面是一个示例。int test_async(){ int
2020-11-04 09:20:52
1186
原创 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
1028
原创 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
2025
翻译 Redis Streams介绍(二)
从永久故障中恢复 上面的例子允许我们向加入到同一使用者组的成员发送信息,处理各自的消息子集,并从故障中恢复,继续读取曾经发送过来的、被挂起的消息。但是,在现实情况,使用者可能发生永久故障而不再恢复,那么对不知何故不再恢复的使用者,那些挂起的信息怎么办呢? 在这种情况下,Redis提供了一个方法,用以回收特定用户的挂起信息,改变它们的所有权,将它们分配给另一个不同的用户。这个特性的目标非常明确,使用者必须能检查挂起的信息列表,并可以用一个特别的命令来获取这些特定信息的所有权...
2020-07-09 08:41:54
498
翻译 Redis Streams介绍(一)
(原文发布于https://redis.io/topics/streams-intro,对应redis6.04,本文已完成大半,忽然发现网上已有翻译文章,但还是按自己的理解完成文章的翻译。原文较长,原想将英文也附上,好对照,但确实太长了,终省去。) “流”是Redis5.0引入的新的数据类型,它的模型来自于日志数据,以一种更加抽象的方式,但日志的基本特征没有变化:通常像一个以只增加方式打开的文件。Redis流基本上就是一个只添加方式的数据结构。至少在概念上,作为一种在内存里展现的抽象的数据...
2020-07-08 09:10:57
671
原创 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
5004
原创 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
3622
原创 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
2791
原创 Boost Beast要点解析(一)
【注】本文不是关于beast的全面描述,只涉及一些要点,主要资料来源于beast官方文档和实现代码。本文对应boost 的版本为1.73。一、Beast中的Buffer
2020-06-15 16:30:29
9867
原创 C++17标准库新增类/函数(二)
std::apply,std::invokestd:apply定义在<tuple>中,因而apply(f,t)的意思就是f(t),其中f是一个可调用的函数,t是一个tuple,pair,array之类的可以调用std::get和std::tuple_size的参数集合类。#include <iostream>#include <tuple>#in...
2018-11-30 15:04:45
2485
原创 C++17标准库新增类/函数(一)
std::FilesystemC++17中的filesystem库基本上与Boost.Filesystem相同。C语言库中有许多对文件的操作,但一直没有对目录及文件属性的操作。C++17中终于加入,主要包括以下内容:对文件系统的操作:path类,空间信息对目录的操作:创建,删除,属性,遍历目录的iterator等对文件整体的操作:删除,拷贝,属性,类型判断等。这些操作,是对以前...
2018-11-30 14:58:24
2223
原创 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
3233
原创 Boost Asio要点概述(二)
三、多任务执行复杂一些的应用,往往存在多个事件任务执行,此时既有可任意顺序执行的场景,也有按指定顺序执行的场景,前者可采用将任务放到多个线程执行,后者要用到”strand”概念。1.多线程支持Boost中io_context是支持多线程的,其内部有一个队列来分配待运行的句柄函数,对服务器端程序来说,这减轻了我们采用多线程同时执行任务的难度,虽然我们不能控制任务在多个线程进行分配的策略。...
2018-10-29 10:05:57
3395
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
18901
3
原创 Boost中的协程—Boost.Asio中的stackful协程
Boost.asio中stackful协程是由Boost::Asio::spawn开启的,文档说,spawn是协程的一种高层次的封装,spawn由许多版本,多用以下定义:template< typename Function>void spawn( const boost::asio::io_context::strand & s, Functi...
2018-09-21 17:03:01
3269
原创 Boost中的协程—Boost.Asio中的coroutine类
Boost.Asio中有两处涉及协程,本文介绍其中的coroutine类。Boost.Asio中的stackless协程是由coroutine类和一些宏来实现的。coroutine类非常简单,包括四个函数,一个int类型变量,用来保存当前函数的运行状态,与之配合使用的宏中,因采用switch来实现,所以可以根据这个整型变量的值实现跳转。Boost.Asio定义了一些宏,构成所谓的“伪关键字...
2018-09-21 16:53:24
4655
原创 Boost中的协程—Boost.Coroutine2
尽管可以有不同的翻译,coroutine本文被叫作协程。概念Coroutine是相对于routine(过程)而提出的,它与一般的父程序调用子程序的routine不同之处在于,它允许挂起一个程序执行点,过后再从挂起的地方继续运行,是一种更高级的程序运行顺序控制。为保证程序挂起再恢复,协程有其自己的栈和控制块,记录挂起时的状态。协程有如下特点:同其他数据类型一样,协程也是第一类(fir...
2018-09-21 16:44:06
15084
2
翻译 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
967
apache2.4 php5.4手工安装包.zip
2013-05-14
Windows平台的包含源代码的libevent(可编译)
2013-01-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人