Marvin's Blog【程式人生】
Ability will never catch up with the demand for it
Home
Tags
Categories
Topics
C++
30
Nov 2020
C++20中的Ranges库
Ranges是C++20引入的一个库。其标准可以参考Ranges library。因为还很新,不是所有额编译器都提供,但是有开源的实现range-v3可以参考使用。 A beginner’s guide to C++ Ranges and Views这篇文章是很好的入 …
04
Nov 2020
Webview2的Win32 C++ API
个人觉得,之所以采用Win32的COM方式来提供WebView2的API,主要时考虑到COM方式的API在Win32,.NET,WinRT中皆可方便使用。 ICoreWebView2 WebView2的核心封装是ICoreWebView2接口(从IUnkown派生出来的)。让你可 …
26
Jul 2020
Pybind11文档笔记【一】:类型转化
Type conversions Overview C++中的类可以用py::class_来包装成Python的类。Python中的类可以通过py::object暴露给C++。 在需要相互转化的时候,pybind会通过值来创建彼此的类型示例,比如: void …
25
Jul 2020
使用Catch2测试C++代码
Catch2是一个C++单元测试框架。话说C++已经有那么测试框架了,为什么还要再创一个新的框架呢? 在Why do we need yet another C++ test framework?作者有所解释。不过我个人的感觉是其他C++单元测试框架大都偏xUnit风格,就 …
28
Jun 2020
C++追踪【二】飞船运算符
编译器在编译的时候其实是知道每个值的类型,有办法生成对于每个值的比较操作。尤其是对于整型值这些天然存在有次序的值,只要按照次序进行比较即可。对于像浮点值或者字符串值会比较复制一点,浮点值有可能是NaN,从而无法进行比较;字符串对比时则需要考虑其长度。 原本C++对于简单的自定义类 …
23
Jun 2020
C++追踪【一】类实例作为模板的非类型参数
C++的模板可以接受非类型参数,也就是接受一个值作为参数。但是能够接受的范围有限,基本上局限在具有内部链接属性的值,集中在整型值,比如各种整数,以及也为整型的指针值。 p0732r0也就是Class Types in Non-Type Template Parameters - …
22
Jun 2020
C++/WinRT学习笔记(十一):异常处理
Error handling with C++/WinRT Error handling with C++/WinRT 异常最好只用来处理异常。而不是用来处理可预期错误。用throw/catch的方式处理可预期错误,不仅影响性能,而且影响代码可读性。异常用于将那些不可预期,无法在 …
23
May 2020
C++/WinRT学习笔记(十):扩展作成类
Extension points for your implementation types winrt::implements提供了一些自定义的行为,让你可以自定义inspectable 对象的行为。 winrt::implements实现的类不能有私有的析构函数,其析构函数必 …
20
May 2020
C++/WinRT学习笔记(九):Agile对象
Agile objects in C++/WinRT 如果一个WinRT类可以被任意线程访问,这个类就是agile的。大部分的WinRT类都是agile的,除了少部分特殊的。C++/WinRT实现的类型默认都是agile的。但是在某些场景下,你希望实现一个非agile的类,让这个 …
05
Apr 2020
读oldnewthing笔记(二):COM Context相关
三人行,必有我师矣!读oldnewthing笔记。 C++ coroutines: Getting started with awaitable objects Give an example of resuming co-routine on background C++ …
01
Feb 2020
读oldnewthing笔记(一):await_suspend以及DispatcherQueue
三人行,必有我师矣!读oldnewthing笔记。 201912 C++ coroutines: The problem of the DispatcherQueue task that runs too soon, part 4 不使用同步原语,而是改成: bool …
30
Jan 2020
C++/WinRT学习笔记(八):异步处理进阶
More advanced concurrency and asynchrony Offloading work onto the Windows thread pool co_await winrt::resume_background()可以把Coroutine挂起之后在线程 …
19
Dec 2019
C++/WinRT学习笔记(七):事件的生成和处理、以及对比C#
Author events in C++/WinRT 这篇文档讲述如何创建事件,举的是下面这个例子: // BankAccountWRC.idl namespace BankAccountWRC { runtimeclass BankAccount { …
17
Dec 2019
C++/WinRT学习笔记(六):接口的录用和作成
Consume APIs with C++/WinRT C++/WinRT实现的是对winmd的投射。Windows SDK自带的ABI头文件会被投射成C++/WinRT的头文件。比如,ABI的Windows::Foundation::Uri会被投射 …
07
Dec 2019
C++/WinRT学习笔记(五):异步操作和强弱引用
C++/Winrt学习笔记 Concurrency and asynchronous operations with C++/WinRT 超过50毫秒的操作,WinRT一般都会将其设为异步操作。异步操作意味着操作调用者不必阻塞并等待操作完成(但是可以选择阻塞)。 WinRT定义了 …
19
Nov 2019
Win32和WinRT的区别
Ars Technica的这篇文章Turning to the past to power Windows’ future: An in-depth look at WinRT从历史的角度对WinRT进行了长篇介绍。简单地说WinRT基于COM,但是目的没有COM那么通用。COM …
21
Sep 2019
C++/WinRT学习笔记(四):XAML集合以及日期转化
C++/Winrt学习笔记 ListView的ItemSource WinRT的ListView是从ItemsControl派生出来的,其ItemSource也是来自于ItemsControl。 对于C++/WinRT而言,需要一堆的接口才能符合ItemSource的要求。 序 …
18
Sep 2019
C++的标准库中chrono
C++11中引入
用于处理计时相关的操作。C++14和17中对其作了一些小的改进。在即将到来的C++20中chrono即将迎来一次大范围的扩充。导致原本就比较复杂的chrono变得愈加复杂。本文局限于C++11中的chrono,做简单介绍。本文的大部分内容参考 …
15
Sep 2019
C++/WinRT学习笔记(三):XAML以及其他
XAML controls; bind to a C++/WinRT property 什么是可观测的属格?如果runtimeclass BookSku有一个属格叫做Title。如果在Title …
14
Sep 2019
C++/WinRT学习笔记(二):ABI接口相关
Interop between C++/WinRT and the ABI WinRT是基于COM,而COM分服务端和客户端,之间通过接口来通信。所以对于C++ WinRT而言,一个重要的工作是封装COM接口,共上层使用。 In general, C++/WinRT …
11
Sep 2019
介绍C++的SIFNAE
C++朝泛型也就是模板化编程的方向越走越远了。SFIANE应该是从C++模板中早就存在的一个概念,是Substitution Failure Is Not An Error的缩写。C++11之后对SFINAE的使用越发发扬光大了。对SFINAE简单的不那么准确的解释:如果几个模板 …
08
Sep 2019
COM学习笔记(六)
Defining COM Interfaces 所有的COM接口都从IUnknown 派生出来。你可以为自定义接口接口生成一个类型库(type library),让客户端可以访问方法信息。接口可以用MIDL描述。 创建一个自定义的COM接口的步骤: Decide how you …
07
Sep 2019
C++/WinRT学习笔记(一):hstring和标准C++类型
本文主要参照String handling in C++/WinRT和Standard C++ data types and C++/WinRT。 hstring WinRT有自己的字符串类型,叫做HSTRING。代表一个不可变的字符串类型,其定义如下: typedef …
03
Sep 2019
COM学习笔记(五)
Making and Processing Asynchronous Calls COM对象支持异步调用。当客户端发起调用之后,服务端可以立刻返回,然后客户端可以继续执行其他工作。等需要结果的时候再向COM接口索要。或者等到任务完成的时候,再向服务端要,就不会被阻塞。 客户端并不 …
02
Sep 2019
COM学习笔记(四)
COM Clients and Servers 在COM的术语中,提供接口实现的的叫做COM服务端;而使用接口的叫做COM客户端。COM服务端又可以分为同进程(in-process )和异进程(out-of-process)两种。同进程的COM服务在DLL中实现,异进程的COM服 …
31
Aug 2019
COM学习笔记(三)
COM其实是一个接口贩子,所有COM对象必须提供IUnknown接口,客户端可以通过这个接口来查询到这个COM对象提供的其他接口,以便贩卖接口。查看Using and Implementing IUnknown。 这个接口有一个特别的要求,那就是每次调用必须返回相同的接口指针。并 …
30
Aug 2019
COM学习笔记(二)
Processes, Threads, and Apartments 文章开头以清晰明确的语言介绍的Process和Thread的概念。 COM引入了Apartment的概念,属于一个Apartment的线程不能直接方法另一个Apartment的内容。要访问的话必须通 …
29
Aug 2019
COM学习笔记(一)
COM是Component Object Model的检查,Windows的关键技术之一。本文是Introduction to COM的学习笔记。 COM是一套接口规范,用于在ABI这个底层界面上实现互相调用。所谓接口可以简单理解为一套可以被远程调用的函数指针集合。每个接口通 …
25
Aug 2019
C++/WinRT中的Coroutine使用
本文参考了Putting Coroutines to Work with the Windows Runtime Slides,来了解一下C++/WinRT是如何使用Coroutine的。 回调、还是回调 如果使用C++/CX来编写WinRT的异步代码,需要使用许多回调函数,如下 …
01
Jul 2019
从C++看C#
来学习一下C#! C# for C++ Developers C++中struct和class是几乎一致的;而C#中这两种是不同的类型定义,struct不支持继承以及构造函数 C++对内存的抽象层度较少,数组其实是指向内存的指针;C#中的数组则是一个抽象类型 C++中整形可以当 …
28
Apr 2019
C++17的string_view
C++17标准库中新增了一个类型,std::string_view。这个类型可以看成是指向字符串的指针加上该字符串的长度的集合。和std::string相比,使用string_view可以避免一些内存分配,从而提高程序性能。但是有一点需要注意:string_view并不拥有其指针 …
02
Dec 2018
一个判断C++模版类是否特化的方法
一个判断C++模版类是否特化的方法。 假如我们有下面这一个C++模版类: template
class Foo { ... void bar() { ... } } 模板类Foo有个方法bar()。假设有一个要求,对于不同类型的模版参数T,都要实现各自的bar(),而不是使用模板 …
26
Nov 2018
记C++代码格式化工具clang-format
Clang编译器包中带了一个代码格式化工具,叫做clang-format,功能强大。 可以使用HomeBrew在macOS系统下安装clang-format: brew install clang-format clang-format自带了几种代码格式化风格,分别是:LLVM, …
12
Nov 2018
c++11的线程(threads)
本文讨论C++11中新引入的对线程的支持。 std::thread C++在11标准中增加了对线程(threads)的支持,看以下例子: // t1.cpp #include
#include
using namespace std; void f() { cout << …
02
Sep 2018
Vim:高亮C++Rawstring中的SQL语句
本文介绍如果让Vim在C++的语法高亮中嵌入SQL的语法高亮。 C++11开始支持rawstring,比如: const char* zSql = R"sql( select * from phantom; )sql"; 上面的例子中,字符串的值是一个SQL语句select * …
07
Aug 2018
C++:关于函数返回的一件小事——是返回值还是返回引用?
C语言中的指针的错误使用,是很多内存错误的根源。C++中引入了_引用(reference)_,来化解指针的毒。但是引用并不是一剂完全的解毒药,还有好多毒还不能解。 下面这个毒就是个例子: int& f() { int a = 1; return a; } 上面的代码,函数f()中 …
31
Jul 2018
在C++中嵌入Python
Python的标准版本是用C语言写成的,提供C语言的API,所以可以很容易嵌入C/C++程序中。本文介绍嵌入操作如何进行,并如何采用cmake编译。 嵌入还是扩展 嵌入(Embedding)是指在C++程序中嵌入Python的解释器。如果你用过Sublime Tex编辑器,你很可 …
26
Jul 2016
回顾一下什么是内存安全
Rust号称是内存安全的语言,所以讨论Rust之前,先学习一下什么是内存安全。从维基百科的Memory_safety页面整理了一份常见的C++内存错误列表(方格中O代表这个内存错误与这种分配方式相关):
(
运行时内存错误)
Allocated on Stack
( …
22
Jul 2016
从C++的角度看Rust
C++是变得越来越复杂了。从一开始作为C的预处理器,让C支持面对对象的语法,到现在,C++支持的编程范式(paradigm)也越来越多,比如可以用C++进行泛型(generics)编程,甚至并发(concurrency)编程。从C++11开始,C++更是对自己从语法上进行大刀阔斧 …
16
Dec 2015
GNU C的typeof和C++11的decltype
今天看Linux的代码,发现了Typeof关键字。这是一个GNU C编译器对标准C的扩展,旨在编译时取得某个变量的类型,下面是一个例子: typeof(a) b的意思是定义一个和a一样类型的变量b。 这让我不禁联想到C++11的关键字Decltype,也有类似的功效: 得出的一个 …
13
Mar 2015
C++1x右值引用在标准容器中的作用
完整的例子可以从gist取得。 C++11引入了右值引用这个特性,上一篇文章介绍了什么是右值引用,但是什么情况下使用右值引用能够改善程序的性能呢? C++中的标准容器库是很有用的工具,我们可以在容器中存放像char, int之类的标量(scalar type),也可以存放自定 …
31
Jan 2015
C++变长参数模板在解析特定文件格式中的应用
假设从设备上读取一个配置文件,这个文件有特定的格式,即文件由若干个段落构成,每个段落有一个标志字段ID,一个记录长度的字段LEN,以及若干数据字段。 以下是一个例子,这个ID为0x70的段落记录了设备运行状况信息,包括设备的温度以及风扇转速: 另一个ID为0x80的段落记录了设备 …
11
Jan 2015
C++的面向对象和Go语言接口方式的比较
C语言中的struct只能表示数据的集合,对数据集合的操作要在单独的函数中实现。比如我们在C语言中定义一个Cat的结构体,Cat有meow()以及sleep()两种行为: 我们把color和breed看作Cat的属性;meow()和sleep()看作是Cat的两个方法。但是在C语 …
03
May 2014
C++1x的右值引用
原文发表在这里。 C++一直号称是比C在类型上更安全的语言,比如C++中可以使用引用(type reference)来在很大范围内代替指针的使用。引用的安全性来自于它的使用受到了编译器的严格控制,必须与一个有址可循的值绑定才可以。所以传统上C++的引用是左值引用(lvalue …
03
May 2014
C语言的restrict pointer和designated initializer
C语言中有两个特性是C++1x还不支持的:restrict pointer和designated initializer,这两个特性都是C99标准引入的。 restrict用来修饰指针。它给编译器一种提示,即当前指针是唯一指向该内存区域的指针,这样编译器可以做相应的优化: 上面的 …