
C/C++
文章平均质量分 78
guxch
愿意与大家讨论编程那点事。邮箱:guxch@sohu.com
展开
-
Lua与C C++的交互(三)
Lua与C/C++的交互:metatable的应用和回调函数种引用“全局”数据。原创 2022-01-24 15:29:48 · 798 阅读 · 0 评论 -
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 · 2637 阅读 · 0 评论 -
C++20新特性—数学计算库
数学常数增加了<numbers>,其中定义了常用的数学常数,如e,log2e,sqrt2,sqrt3等。Bit操作新增了一些列bit的操作,如按位判断有几个0,几个1等,具体内容参加库函数说明,用法示意如下(std::bit_cast在gcc10.2中未被支持):...原创 2021-02-07 09:41:06 · 1024 阅读 · 0 评论 -
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 · 1415 阅读 · 0 评论 -
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 · 1075 阅读 · 0 评论 -
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 · 4278 阅读 · 0 评论 -
C++20新特性—三路比较符<=>
集合(set,map等)算法通常会涉及元素比大小,因此两个元素(类型)的比较操作就显得额外重要。两个类型之间的共有六种比较符(<,<=,>,>=,==,!=),如果需要完整的表达,就要写六个函数,如果需要与可转换类型比较,这项工作显得比较繁琐,因此这也是C++引入<=>的基本初衷。【如果认为用一个比较符,例如”<”就可以推导出另外几个,其实这只适用于一些场景,这也是C++引入新的比较操作符的另一个原因。】<=>称为3-way comparison o原创 2021-01-29 13:46:33 · 4249 阅读 · 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 · 2116 阅读 · 0 评论 -
C++20新特性—range(一)
“Ranges”的意思是一组元素的集合,既然是集合,最基本的操作就是对其中元素的枚举(iterate),按照一个集合是否可读写以及如何进行枚举,集合可分为以下几类(以concept形式体现)原创 2021-01-28 14:02:20 · 5647 阅读 · 0 评论 -
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 · 1559 阅读 · 1 评论 -
C++20新特性—coroutine协程(一)
所谓“协程”,简单点说就是一个函数可以中止运行,待“条件成熟”后,再次在断点的地方重新运行,即能以“进入-暂停-继续-暂停…”这样的方式运行函数,因此讨论协程,需要关心下面几个问题:在运行点暂停,然后再运行—暂停点的记录 暂停时的运行环境,恢复运行时,应首先恢复当时的环境—运行环境的记录 因协程状态是变化的,因此需要有办法查询协程当前的运行状态,包括返回值、异常等—协程状态的记录异步操作是 “慢”资源与“快”资源协调编程方面的一个“老”问题,协程的目标就是试图以“同步的形式”编写出异步操作的效果。原创 2020-12-23 14:56:44 · 2682 阅读 · 0 评论 -
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 · 766 阅读 · 0 评论 -
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 · 1435 阅读 · 0 评论 -
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 · 7470 阅读 · 1 评论 -
C++20新特性—module
模块概念是现代编程语言的一大特征,目的是将大型程序分割成合适的部分(包括复用),再通过相关规则组合起来。C/C++一直采用.h文件的方式,将函数/类型声明与它们的实现分开,这种方式大致上有三个问题:重复、循环包含问题(虽然ifndef等可以解决此问题,但并不方便)。 函数声明与实现分开,函数类型说明一般需要写两遍,修改时不方便。 模板的引入,使得大量代码只能在.h中编写,整个程序的编译速度变慢(尤其存在大量模板类的场景)。在这方面,C#,java中模块定义、引入机制要简洁、方便得多。Modules原创 2020-12-07 15:54:11 · 1398 阅读 · 0 评论 -
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 · 5684 阅读 · 0 评论 -
Libuv应用(二)
三、TCP/UDPLibuv最常用的应用是TCP和UDP通信。它们是libuv的主要功能,但有很多文章都描述了,本文就不涉及了。四、人工通知事件一般情况下,一个线程运行一个事件循环,线程阻塞,等待事件的发生,如果我们想“干预”一下这个事件循环,例如,停止它,向某个socket通道发点信息等,就需要人工“制造”一个消息触发一次,此时就需要用到uv_async_t。由于事件循环的线程处于阻塞状况,所以发消息的函数应该在另一个线程。下面是一个示例。int test_async(){ int原创 2020-11-04 09:20:52 · 1168 阅读 · 0 评论 -
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 · 1012 阅读 · 0 评论 -
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 · 4970 阅读 · 0 评论 -
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 · 3600 阅读 · 0 评论 -
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 · 2769 阅读 · 0 评论 -
Boost Beast要点解析(一)
【注】本文不是关于beast的全面描述,只涉及一些要点,主要资料来源于beast官方文档和实现代码。本文对应boost 的版本为1.73。一、Beast中的Buffer原创 2020-06-15 16:30:29 · 9823 阅读 · 0 评论 -
Boost中的协程—Boost.Coroutine2
尽管可以有不同的翻译,coroutine本文被叫作协程。概念Coroutine是相对于routine(过程)而提出的,它与一般的父程序调用子程序的routine不同之处在于,它允许挂起一个程序执行点,过后再从挂起的地方继续运行,是一种更高级的程序运行顺序控制。为保证程序挂起再恢复,协程有其自己的栈和控制块,记录挂起时的状态。协程有如下特点:同其他数据类型一样,协程也是第一类(fir...原创 2018-09-21 16:44:06 · 15038 阅读 · 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 · 953 阅读 · 0 评论 -
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 · 1829 阅读 · 0 评论 -
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 · 5826 阅读 · 0 评论 -
Hypertable - 概述
【注:近来需要使用分布式数据库,就把Hypertable看了一下,现将官方网站的有关文档翻译出来,供大家参考。】Overview(http://hypertable.com/documentation/)概述Hypertable is a high performance, opensource, massively scalable database modeled afte翻译 2012-07-18 22:19:05 · 1919 阅读 · 0 评论 -
Boost中的协程—Boost.Asio中的coroutine类
Boost.Asio中有两处涉及协程,本文介绍其中的coroutine类。Boost.Asio中的stackless协程是由coroutine类和一些宏来实现的。coroutine类非常简单,包括四个函数,一个int类型变量,用来保存当前函数的运行状态,与之配合使用的宏中,因采用switch来实现,所以可以根据这个整型变量的值实现跳转。Boost.Asio定义了一些宏,构成所谓的“伪关键字...原创 2018-09-21 16:53:24 · 4627 阅读 · 0 评论 -
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 · 3252 阅读 · 0 评论 -
Boost Asio要点概述(二)
三、多任务执行复杂一些的应用,往往存在多个事件任务执行,此时既有可任意顺序执行的场景,也有按指定顺序执行的场景,前者可采用将任务放到多个线程执行,后者要用到”strand”概念。1.多线程支持Boost中io_context是支持多线程的,其内部有一个队列来分配待运行的句柄函数,对服务器端程序来说,这减轻了我们采用多线程同时执行任务的难度,虽然我们不能控制任务在多个线程进行分配的策略。...原创 2018-10-29 10:05:57 · 3381 阅读 · 2 评论 -
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 · 3214 阅读 · 0 评论 -
C++17标准库新增类/函数(一)
std::FilesystemC++17中的filesystem库基本上与Boost.Filesystem相同。C语言库中有许多对文件的操作,但一直没有对目录及文件属性的操作。C++17中终于加入,主要包括以下内容:对文件系统的操作:path类,空间信息对目录的操作:创建,删除,属性,遍历目录的iterator等对文件整体的操作:删除,拷贝,属性,类型判断等。这些操作,是对以前...原创 2018-11-30 14:58:24 · 2212 阅读 · 0 评论 -
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 · 2472 阅读 · 0 评论 -
python与C C++的交互(三)
六.在C/C++环境中调用python代码在这种情况下,C/C++代码是主程序,按复杂度,分几个例子说明。1.最简单情况,无参数传递int run_simple_py(){ char const *script="def hello():\n\tprint(\"hello world!\")\nhello()"; int res; Py_Initialize(); res=PyR...原创 2018-05-16 10:21:23 · 2382 阅读 · 0 评论 -
python与C C++的交互(二)
五.在python环境中调用C/C++代码前面是两点基础,这节说明在python环境中调用C/C++代码。大致有两种方式:1. 将c/c++代码编译成(操作系统)标准的动态库,在python中“引用”后调用2. 将c/c++代码写成python扩展库,就如同python的内置的标准库一样,正常引用后调用第一种方式比较简单,下面是一个简单示例。C/C++代码(文件名为mm.c...原创 2018-05-16 10:13:45 · 3051 阅读 · 0 评论 -
跨平台的动态链接库的调用
一、三种库函数的链接方式用过C语言的都知道库函数的重要:我们将功能比较独立的部分做成一个个函数,供我们复用。最终对库函数的引用有3种方式:方式链接时刻库指定时刻特点静态链接编译时编译时编译时检查链接错误,编入运行程序(运行程序独立)动态链接运行时编译时检查链接错误,运行时调入依赖库运行时运行原创 2012-08-28 21:10:47 · 8042 阅读 · 0 评论 -
Hypertable - 安装-单机
【 Hypertable 有几种安装方式,入下表:1. 单机:安装于单机,采用本地文件系统2. Hadoop:分布式安装,在Hadoop之上(HDFS)3. MapR:分布式安装,在MapR之上4. ThriftBroker:在应用服务器上安装ThriftBroker 】Standalone(http://hypertable.com/documentation/i翻译 2012-07-25 22:34:51 · 2522 阅读 · 0 评论 -
Hypertable - 安装-ThriftBroker
【 Hypertable 有几种安装方式,入下表:1. 单机:安装于单机,采用本地文件系统2. Hadoop:分布式安装,在Hadoop之上(HDFS)3. MapR:分布式安装,在MapR之上4. ThriftBroker:在应用服务器上安装ThriftBroker 】ThriftBroker only(http://hypertable.com/do翻译 2012-07-27 16:45:19 · 1812 阅读 · 0 评论 -
Hypertable - 安装-MapR
【 Hypertable有几种安装方式,入下表:1. 单机:安装于单机,采用本地文件系统2. Hadoop:分布式安装,在Hadoop之上(HDFS)3. MapR:分布式安装,在MapR之上4. ThriftBroker:在应用服务器上安装ThriftBroker】MapR(http://hypertable.com/documentation/installation/翻译 2012-07-27 08:24:11 · 3491 阅读 · 0 评论 -
Hypertable - 安装-Hadoop
【 Hypertable有几种安装方式,入下表:1. 单机:安装于单机,采用本地文件系统2. Hadoop:分布式安装,在Hadoop之上(HDFS)3. MapR:分布式安装,在MapR之上4. ThriftBroker:在应用服务器上安装ThriftBroker】 Hadoop(http://hypertable.com/documentation/installa翻译 2012-07-25 22:45:10 · 3086 阅读 · 2 评论