自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序员Link

左手代码,右手生活。日拱一卒,脚踏实地。

  • 博客(314)
  • 收藏
  • 关注

翻译 LinkedIn 高效代码审查的技巧

https://thenewstack.io/linkedin-code-review/

2023-12-08 19:05:56 100

翻译 Github 上编程语言和代码质量的大规模研究

Communications of the ACM上的一篇文章《》,基于Github上数据收集及分析,研究编程语言对软件质量的影响。

2023-12-06 15:43:36 107

原创 使用neon构建Nodejs的Rust addon简单示例

使用neon构建Nodejs的Rust addon简单示例。

2022-10-24 09:53:44 741 1

翻译 Asio Custom Memory Allocation

Asio Custom Memory Allocation

2022-10-21 19:54:54 465

翻译 Asio Line-Based Operations

许多常用的internet协议是基于行的,这意味着他们具有由字符序列"\r\n"分隔的协议元素。这样的协议有HTTP、SMTP和FTP。为更容易实现基于行的协议以及其他使用分隔符的协议,Asio包括read_until()和async_read_until()函数。...

2022-07-29 20:15:23 456

翻译 Asio Reactor-Style Operations

有时程序必须与想要自己执行 I/O 操作的第三方库集成。为了促进这一点,Asio 包括同步和异步操作,可用于等待套接字准备好读取、准备好写入或有待处理的错误条件。例如,要执行非阻塞读取,可以使用以下内容:ip::tcp::socket socket(my_io_context);...socket.non_blocking(true);...socket.async_wait(ip::tcp::socket::wait_read, read_handler);...void read_han

2022-04-07 10:14:52 162

翻译 Asio Streams, Short Reads and Short Writes

Asio 中的许多 I/O 对象都是面向流的。这意味着:没有消息边界。正在传输的数据是一个连续的字节序列。读取或写入操作传输的字节数可能少于请求的字节数。这称为短读或短写。提供面向流的 I/O 的对象模拟以下一种或多种类型要求:SyncReadStream,其中同步读取操作是使用成员函数read_some()执行的 。AsyncReadStream,其中异步读取操作是使用成员函数async_read_some()执行的。SyncWriteStream,其中同步写入操作是使用成员函数writ

2022-04-07 10:02:24 182

翻译 Asio Buffers

Buffers从根本上说,I/O涉及在内存的连续区域(称为缓冲区)之间传递数据。这些缓冲区可以简单地表示为由一个指针和一个以字节为单位的大小组成的元组。为了能够高效地开发网络应用程序,Asio包括对分散-收集操作(scatter-gather)的支持。这些操作涉及一个或多个缓冲区:分散-读(scatter-read)将数据接收到多个缓冲区中收集-写(gather-write) 传输到多个缓冲区因此我们需要一个抽象来表示缓冲区的集合。Asio使用的方法是定义一个类型(实际是两个类型)来表示单个缓冲

2022-03-24 10:22:18 552

翻译 Asio Strands: Use Threads Without Explicit Locking

链: 使用没有显式锁定的线程链(strand)被定义为事件处理程序的严格顺序调用(即没有并发调用)。链的使用允许在多线程程序中执行代码而不需要显式锁定(例如使用mutex)。stand可以是隐式的或者显式的,如以下替代方法所示:仅从一个线程调用io_context::run()意味着所有事件处理程序都在隐式链中执行,因为io_context保证处理程序只能从run()内部调用。如果存在与连接相关的单条异步操作链(例如,在HTTP等半双工协议实现中),则不可能同时执行处理程序,这是一条隐式链。显式

2022-03-10 20:41:15 201

翻译 Asio Threads and Asio

线程安全一般并发使用不同的对象是安全,但是并发使用单个对象并不安全。但是,诸如io_context类型提供了更强保证,即安全并发使用单个对象线程池多个线程通过调用io_context::run()建立线程池,可以从中调用完成处理程序。此方法也可与post()一起使用作为跨线程执行任意计算任务的一种方式。注意加入io_context池的所有线程都是等效的,并且io_context可以以任何方式在它们之间分配工作。内部线程特定平台的库实现可以试用一个或多个线程来模拟异步性。这些线程必须对库用户不可见

2022-03-07 20:29:32 141

翻译 Asio The Proactor Design Pattern: Concurrency Without Threads

Proactor 设计模式:没有线程的并发Asio库提供同步和异步操作的并行支持(side-by-side support)。异步支持基于Proactor设计模式。与仅同步或者Reactor方法相比,异步的优缺点概述如下:Proactor和Asio让我们看看Proactor设计模式在Asio中是如何实现的,而不参考特定于平台的细节。Proactor设计模式异步操作(Asynchronous Operation)定义异步执行的操作,例如对套接字的异步读写异步操作处理器(Asynchro

2022-02-23 09:56:59 147

翻译 Asio Basic Asio Anatomy

Basic Asio AnatomyAsio may be used to perform both synchronous and asynchronous operations on I/O objects such as sockets. Before using Asio it may be useful to get a conceptual picture of the various parts of Asio, your program, and how they work togethe

2022-02-18 07:27:32 136

翻译 Asio Rationale

RationaleMost programs interact with the outside world in some way, whether it be via a file, a network, a serial cable, or the console. Sometimes, as is the case with networking, individual I/O operations can take a long time to complete. This poses pa.

2022-02-17 09:47:02 106

原创 C++ STL 算法汇总

非更易型算法更易型算法移除区间元素算法变序型算法排序算法已排序区间算法数值算法

2022-02-10 16:28:35 296

原创 C++14 lambda的捕获列表初始化

在C++11中lambda捕获列表有两种方式:值捕获和引用捕获,捕获的是外层作用域的变量,也就是左值。C++14进行了扩展,允许捕获的成员用任意的表达式进行初始化,相当于允许捕获右值。举例int x = 100;auto f = [x = 0]() mutable { return x++; };std::cout << "f()=" << f() << std::endl;std::cout << "f()=" << f() &l.

2021-12-15 20:43:26 2065

原创 C++14 泛型lambda

即lambda的参数列表中可以使用auto。// 执行 g++ -c -std=c++11 generic_lambdas.cpp 通过auto f = [](int a) {std::cout << a << std::endl;};// 执行 g++ -c -std=c++11 generic_lambdas.cpp 报错// generic_lambdas.cpp:7:13: error: 'auto' not allowed in lambda parame.

2021-12-15 20:01:28 1013

原创 Git 提交指定文件的部分修改

使用场景举例被分配了两个Bug,已经改好了A, 正在处理B, 但被要求先提交A, AB有修改在同一文件里,那么问题来了:Git 如何提交文件的部分修改?命令git add --patch | -p <filename>查看命令解释如下lee@leedeMacBook-Pro git_learn % git add -p --helpusage: git add [<options>] [--] <pathspec>... -n, --dry

2021-12-07 21:11:47 1957

原创 C++14 变量模板

目录定义定义举例使用参考定义变量模板定义一族变量或者类静态数据成员。template < parameter-list > variable-declaration定义举例定义一族变量template<class T>constexpr T pi = T(3.1415926);定义一族类静态数据成员using namespace std::literals;struct matrix_constants{ template<clas

2021-12-03 20:24:33 1173

原创 C++ 返回类型为bool的函数未返回导致的问题

问题:写一个类方法A,返回类型为bool,但在函数体中忘记返回。利用NDK构建C++库提供给Android后,上层方法A总是崩溃。通过排查日志,崩溃时调用了不该调用的另一个类方法B,不得其解。阅读代码,意外发现类方法B的定义就紧接着类方法A的定义,然后发现了类方法A没有写return。反过来看,其实在编译过程中已经有相关的警告,如下。所以不要只关注错误,还要关注这些“不重要”的警告,它会在你不察觉的地方埋雷。…xxxx.cc:959:1: warning: control reaches end.

2021-11-19 19:38:41 3100 5

原创 Android Studio 缓存问题

描述替换工程加载的.a库,运行发现打印的日志是旧的,但确定路径下的库文件已经替换。Sync Project with Gradle Files不起作用。Build - Clean Project 不起作用。解决File - Invalidate Caches / Restart 后运行正常...

2021-09-30 09:51:40 209

原创 C++ 那些被遗漏的细节7 std::list::merge

之前有演示过std::merge的用法,参见C++ 算法 归并元素然后看下std::list::merge的例子#include <iostream>#include <list> std::ostream& operator<<(std::ostream& ostr, const std::list<int>& list){ for (auto &i : list) { ostr &..

2021-09-07 19:33:44 496

原创 CMake Tutorial6 增加扩展命令和生成的文件

一 内容本文主要演示两项:(1) add_custom_command 的使用;(2) 如果在源代码中使用过程中生成的源文件。在CMake Tutorial5 增加系统自省 基础上修改。增加 MathFunctions/MakeTable.cxx 文件,内容如下:// A simple program that builds a sqrt table#include <cmath>#include <fstream>#include <iostream>

2021-09-03 20:34:34 160

原创 CMake Tutorial5 增加系统自省

目录一 内容二 构建及测试三 Github四 参考一 内容有些场景下,某些功能能否使用取决于目标平台(target platform)是否有该功能。本文主要说明如何通过 check_symbol_exists 实现对头文件中符号(功能)的检测,如果功能存在则使用该功能。在 CMake Tutorial4_2 测试支持 上修改,去掉test部分,在 MathFunctions/CMakeLists.txt 中增加 check_symbol_exists 的处理,如下:## MathFunction

2021-09-03 19:03:27 93

原创 NDK 下载旧版本

NDK官网最新版本下载, 当前最新版本为 r23。NDK官网旧版本下载 中,链接失效,可通过 https://dl.google.com/android/repository/ + 软件包名称 下载,例如:https://dl.google.com/android/repository/android-ndk-r22b-darwin-x86_64.zip...

2021-09-01 15:32:13 377

原创 Python 不生成pyc文件的几种方式

设置环境变量。例如在Mac的.zshrc中加入export PYTHONDONTWRITEBYTECODE=1使用 -B 参数python -B xxx.py设置dont_write_bytecodeimport syssys.dont_write_bytecode = True

2021-08-31 11:52:29 509

原创 RC4 加解密问题

问题需要注意RC4连续加解密的状态问题(下述实现中的key的x、y值)。例如CS两端数据交互的加解密场景。官方实现// https://github.com/openssl/openssl/blob/master/crypto/rc4/rc4_enc.c/* * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (t

2021-08-23 20:31:47 244

原创 Xcode Undefined symbols 错误

报错信息error:Undefined symbol: typeinfo for sdk::IConfigUndefined symbol: vtable for sdk::IConfig具体信息:Undefined symbols for architecture x86_64: "typeinfo for sdk::IConfig", referenced from: typeinfo for sdk::ConfigImpl in sdk.a(config_impl.o)

2021-08-17 17:21:52 3454

原创 VSCode 折叠展开快捷键 macOS版

查看command+shift+p 搜索fold和unfold举例折叠所有:command+k+0(数字0)展开所有:command+k+j折叠光标所在代码块:command+k+[展开光标所在代码块:command+k+]

2021-07-27 19:24:19 4078

原创 Xcode 报错duplicate symbols for architecture x86_64

现象// 报错代码// a.htemplate<typename T>struct A {public: A(int a):a_(a){std::cout << "A";}private: int a_;};// 构造函数的特化?// 感觉写法并不标准,因为实际需要进行类模板的特化// 但报错原因暂不能解释清楚=_= 欢迎高手解惑!template<>A<std::string>::A(int a):a_(a){std

2021-07-23 11:24:15 599

原创 C++ 那些被遗漏的细节6 shared_ptr owner_before

语法// <memory>// template< class T > class shared_ptr; (since C++11)template< class Y >bool owner_before( const shared_ptr<Y>& other) const noexcept;template< class Y >bool owner_before( const std::weak_ptr<Y>&a

2021-07-22 09:45:59 187

原创 C++ 那些被遗漏的细节5 shared_ptr别名构造函数

概述shared_ptr的基本使用可以参考之前文章: C++11 shared_ptr weak_ptr。别名构造函数// cppreferencetemplate< class T > class shared_ptr;(since C++11)// 别名构造函数template< class Y >shared_ptr( const shared_ptr<Y>& r, element_type* ptr ) noexcept;c

2021-07-21 20:08:21 390

原创 C++ 那些被遗漏的细节4 std::piecewise_construct_t

简述在以前的文章C++ std::pair 有对std::pair做简单介绍。需要注意的是std::pair有一个特别的构造函数,第一个参数类型为std::piecewise_construct_t, 实际就是一个空结构体类型,用作标识。std::piecewise_construct_t作用就是其字面意思:分段构造。具体来说,因pair的key和value均可以是构造函数复杂类型,因而pair的初始化相对复杂,通过带有std::piecewise_construct_t类型参数,后跟两个tuple

2021-07-13 11:43:50 2235

原创 C++ 那些被遗漏的细节3 std::get

简述在之前的文章C++11 std::tuple 中使用std::get获取std::tuple元素的例子。std::get除了通过索引(C++11)获取std::tuple的元素,还能通过元素类型获取元素(C++14)语法// 头文件 <tuple>template< std::size_t I, class... Types >typename std::tuple_element<I, tuple<Types...> >::type&am

2021-07-12 18:50:41 5877

原创 C++ 那些被遗漏的细节2 map emplace emplace_hint

说明主要关注map的emplace、insert的返回类型 std::pair<iterator, bool> 和 emplace_hint的返回类型iterator。template< class... Args >std::pair<iterator,bool> emplace( Args&&... args );(since C++11)如果插入成功,则iterator指向新插入元素,否则指向已存在的相同key元素;插入成功bool为

2021-07-08 19:46:07 557

原创 C __VA_ARGS__宏

C99中规定宏也可以使用可变参数(参考C variadic函数)。于是有了__VA_ARGS__宏。举例#define LogAny(fmt, ...) printf(fmt, ##__VA_ARGS__)说明没有## ,语法也是正确的,但当可变参数个数为0时会报错。加上##的作用在于,当可变参数个数为0时,##能把前面多余的","去掉。...

2021-06-25 20:00:29 179

原创 C variadic函数

一 定义variadic函数,即可变参数函数,是例如printf这样需要可变数量参数的函数。函数声明使用…作为最后一个参数,且至少之前有一个命名参数(自C89,K&R C 不支持)。二 访问在函数体中访问可变参数需要stdarg.h中的工具,具体如下:va_start:允许访问可变参数函数参数(函数宏)va_arg:访问下一个可变参数函数参数(函数宏)va_copy(C99):制作可变参数函数参数(函数宏)的副本va_end: 结束可变参数函数参数(函数宏)的遍历va_li

2021-06-25 19:33:01 416

原创 C++ 那些被遗漏的细节1 find_first_of

show code#include <iostream>#include <string>int main(){ std::string str = "hello world"; std::string sign = "wo"; std::cout << "position: " << str.find_first_of(sign) << std::endl; return 0;}结果position: 4

2021-06-23 20:23:55 166

原创 VSCode C++开发环境设置-更多C/C++配置 macOS版

VSCode C++开发环境设置-更多C/C++配置, 重点在于通过c_cpp_properties.json文件提供更多控制。请先阅读VSCode C++开发环境设置-构建及运行 macOS版和VSCode C++开发环境设置-调试 macOS版, 本文在其基础上进行说明。步骤可以创建c_cpp_properties.json文件提供更多的C/C++扩展控制。例如改变编译器路径、包含路径、C++标准等。按⇧⌘P,在出现的下拉框中选择C/C++: Edit Configuration.

2021-06-21 21:11:03 504 1

原创 VSCode C++开发环境设置-调试 macOS版

VSCode C++开发环境设置-调试引用,重点在于调试器设置文件 launch.json 。请先阅读VSCode C++开发环境设置-构建及运行 macOS版, 本文在其基础上进行说明。步骤我们创建launch.json文件来配置VSCode在我们调试的时候启动LLDB调试器。主菜单Run->Add Configuration, 在弹出的下拉窗口中选择C++ (GDB/LLDB)。然后下拉窗口选项变成了预定义的调试配置。选择clang++ build and debug.

2021-06-21 20:46:29 1603

原创 VSCode C++开发环境设置-构建及运行 macOS版

VSCode C++开发环境设置-构建及运行,重点在于编译器设置文件 tasks.json 。步骤下载 Visual Studio Code on macOS安装C++扩展安装Clang查看命令: clang --version若未安装,安装命令行开发工具的命令:xcode-select --install新建文件夹helloworld, 用VSCode打开, 然后新建main.cpp, 当前目录结构如下:helloworld |- helloworld.cpp.

2021-06-21 20:16:49 526

空空如也

空空如也

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

TA关注的人

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