- 博客(608)
- 资源 (24)
- 收藏
- 关注
原创 两张图看懂UMA与NUMA
NUMA系统中因为内存可以连接到不同的内存上,因此具有更好的内存扩展性。因为在NUMA系统中想要存取不同内存上的数据时,需要核心直接交互才能实现,跨NUMA会导致几纳秒的时间浪费,因此如果程序对性能比较敏感需要将程序绑定到指定的NUMA上,以此来避免不同NUMA之间核的交互。在拥有多个多核处理器的共享内存系统中,互联网络可以将所有的处理器直接连接到主存上,或者将每个处理器直接连接到一块内存,通过处理器内置的特殊的硬件使得各个处理器可以访问内存中的其他块。
2022-10-17 09:48:07 1427
原创 swig封装C/C++实战-实现go调用C++然后C++在调用go
代码组织结构[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AS1ZsCqX-1660366325978)(image/-16603662235741.png)]以下所有文件生成指令都是:Goinexample.i 文件mian.go测试文件Exampleexample.iexample.hexample.cppmain.goVariablesmain.goexample.iexample.hexample.c枚举型变量封装example.iex
2022-08-13 12:56:18 877
原创 SWIG教程-对C/C++语言的封装《三》
命名空间作为C++的一项基础功能,在swig支持的很好,但是如果不使用指令控制swig遇到一些比较棘手的问题还是会直接报错,比如默认情况下两个命名空间中有相同的类时,swig将无法区分两个类,因为swig的默认处理是将所有的命名空间的种类型都完全暴露出来,因为目标语言中可能没有明明空间这个概念(go语言也是后期才添加上的)通过设置directors可以让swig实现对回调函数的封装,设置之后swig会在对应的目标语言中生成目标语言的回调函数封装。当函数是类的成员函数时,这时需要在类内进行模板封装。.....
2022-08-10 11:19:10 995
原创 SWG教程《四》- go语言封装
go语言不支持直接调用C或者C++语言,虽然通过cgo转接go可以实现对c的调用,但是调用过程各种数据类型之间无法还是无法直接转换,使用起来也不是很方便,而swig刚好能够填补这个空白而且只要是go 1.2之后的版本,可以通过go build直接使用swig生成的源码虽然swig会尽量将C、C++封装成go代码,但是由于两种语言之间的不同,还是会有部分改动在里面,比如const类型通过只对外提供Get接口来实现,通过defer来实现对对象内存的管理等。......
2022-08-10 10:35:45 423
原创 SWIG教程-封装指令的使用《二》
但是需要注意的是,inline只是对函数和变量有效,对于头文件的引用是否封装,还是需要原有的方式,在代码块中使用#include 引入头文件,而需要封装成目标代码的头文件需要在代码块外使用%include指令来告知swig需要对该头文件进行封装。很多C类型的结构体是不能绑定成员函数的,但是其他函数中都能,为了提供便利swig支持为C类型的结构体绑定额外的成员函数用来辅助结构体的创建和使用,这时就要用到%extend指令了。一些需要传入回调的函数,需要提前声明,不能将目标函数实现的函数直接传入。......
2022-08-10 10:24:49 665
原创 swig教程-指令文件《一》
为了区分不同语言以及在部分指导文件中能够区别进行,siwg中提前预定义了一些变量为了更好的实现对源码的封装,swig提供了一种增强型的宏定义指令, %define 和 %enddeffree(t);
2022-08-10 10:01:22 1157
原创 深入理解LInux ELF可执行程序
一个源文件在生成可执行程序的过程中地址需要经过以下几个主要步骤。源文件在经过编译器处理之后会生成可重定位目标文件,也就是我们常见的.o文件,经过链接器处理之后,会将多个.o文件处理成可执行文件。 称为可重定位目标,包含二进制代码和数据,其形式可以和其他目标进行合并,创建一个可执行目标文件因为.o文件也是ELF文件的一种,所以我么可以使用readelf -h 来查看.o文件的elf头数据通过与文件头结构体对比首先看到的是Magic魔法数字,这些数字的大小由宏定义 来进行限定,Magic放在ELF文件
2022-06-25 13:09:55 1062
原创 tcpdump常用技巧以及wireshark借助tcpdump实现跨设备远程抓包
tcpdump - dump traffic on a network interface[IMPORTANT].Feeding the Werewolves认识tcpdump刚开始接触tcpdump肯定会被这些参数给吓到,其实实际使用中只需要掌握几个关键的参数就行了。53端口是DNS使用的端口,DNS分为查询和应答:DSN requires – DNS response,来让我们看一下我们的电脑在查询哪些DNS[TIP]我有个程序,监听所有的网卡上,监听端口是1668,我应该如何抓包...
2022-06-16 23:34:06 355 1
原创 go语言定义二维数组
使用go语言二维数组go语言不用管理内存,很多地方使用起来确实很方便,但是在算法方面确实没有C++优秀,特别是缺少像STL一样优秀模板,定义一个二维数组需要进行如下复杂的操作:go语言的二维数组定义和初始化比较特殊,需要先初始化行数再初始化列假设要定义一个,行数为row, 列数为column的二维数组,怎可以按照如下方式实现// 先初始化一个二维数组,数组为row行,每行存储一个切片,具体大小先不定dp := make([][]int, row)// 然后再为每行申请一个 column的数组放入
2022-03-28 22:17:33 4559
原创 那些值得学习的C++框架和常用库
标准库C++标准库,包括了STL容器,算法和函数等。C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。Standard Template Library:标准模板库C POSIX library : POSIX系统的C标准库规范ISO C++ Standards Committee :C++标准委员会框架C++通用框架和库Apache C++ Standard Library:是一系列算法,容器,迭代器和其他基本组件的
2022-03-14 11:34:13 7226 1
原创 LFUCache
LFUCacheLFU是Least Frequently Used的缩写,即最不经常最少使用算法,也是一种常用的页面置换算法,选择访问计数器最小的页面,并予以淘汰。根据LFU的策略,我们每次访问对象都需要更新访问计数器,当插入B的时候,发现缓存中有B,所以增加访问计数器,兵把B移动到访问计数器从大到小排序的地方。当插入一个元素时,先更新访问计数器,在移动到它排序以后的位置,如果页面中已经满了,就将末尾的元素进行剔除当插入一个数据时,尾部有多个数据计数器值相同,这个时候插入是从相同计数器顶端开始插入
2022-03-13 23:47:05 871
原创 LRUCache
LRUCacheLRUCache又称为最近很少使用算法,不是说这个算法最近很少使用,是算法的名字叫做最近很少使用LRU是 Least Recently Used的缩写,即最近很少使用,是一种常用的页面置换算法,选择最近很久未使用的页面予以淘汰。LRUCache是一种缓存策略,持有的是强引用,但是会控制在一个峰值下。它内部维护了一个队列(允许插队的队列),每当从中取出一个值时,该值就移动到队列的头部。当缓存已满而继续添加时,会将队列尾部的值移除,方便GC。LRUCache用于内存缓存,在避免程序发生OO
2022-03-13 16:29:56 992
原创 算法中常用位操作
算法中常用位操作1.1 异或操作x ^ 0 = xx ^ 1111...1111 = ~xx ^ (~x) = 1111...1111x ^ x = 0a ^ b = c ==> a ^ c = b ==> b ^ c = aa ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c1.2 构造特殊的Mask,将特殊位置放0或者1x & (~0 << n) // 将x右边n位清零(x >> n) & 1 //.
2022-03-13 16:27:16 509
原创 线段树segment_tree go语言实现
线段树(segment tree)什么是线段树线段树是一种二叉搜索树,什么叫做二叉搜索树,首先满足二叉树,每个结点度小于等于二,即每个结点最多有两颗子树,何为搜索,我们要知道,线段树的每个结点都存储了一个区间,也可以理解成一个线段,而搜索,就是在这些线段上进行搜索操作得到你想要的答案。线段树是建立在线段的基础上,每个结点都代表了一条线段[a,b]。长度为1的线段称为元线段。非元线段都有两个子结点,左结点代表的线段为[a,(a + b) / 2],右结点代表的线段为[((a + b) / 2)+1,b]
2022-03-11 22:29:22 814 1
原创 为什么`malloc`出来的内存也能当成对象正常使用
为什么malloc出来的对象也能正常使用新学习C++语言的人会感觉到很疑惑,因为相比于C语言,C++多了个类;也正是这个类给很多人带来了困扰,class究竟是什么,它和struct的差别又是什么?结构体我们能使用new申请,也能使用malloc申请使用都没有问题,但是在类的创建教科书中给的方法是使用new进行创建。为什么一定要使用new进行创建?搜索new和malloc的区别我们可以看到如下说明:malloc与free是c++/c语言的标准函数,new/delete是C++的运算符。new返回指
2022-03-01 11:02:44 561
原创 从使用角度看何为zookeeper
Zookeeperzookeeper作用作用:中间件,提供协调服务,提供协助运算,协助管理存储等功能作用于分布式系统,发挥其优势,可以为大数据服务支持java,提供java和c语言的客户端Api特性:一致性:数据一致性,数据按照顺序分批次入库原子性:事务要么成功要么失败,不会局部化单一视图:客户端链接集群中的任一节点,数据都是一致的可靠性:每次对zk的操作状态都会保存在服务端实时性:客户端可以读取到zk服务端的最新数据作用体现:Master节点选举,主节点挂了之以后,从节
2022-01-13 23:08:06 916
原创 zk客户端操作手册
ZooKeeper-cli: the ZooKeeper command line interfacePre-requisitesEnter into the ZooKeeper-cli# connect to the localhost with the default port:2181bin/zkCli.sh# connect to the remote host with timeout:3sbin/zkCli.sh -timeout 3000 -server remoteIP:2181
2022-01-03 23:34:16 2132
原创 C++list常用接口总结
List是stl实现的双向链表,与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢。使用时需要添加头文件如果使用的数据插入和删除特别多的话可以考虑使用list来进行数据管理#include <iostream>#include <list>#include <algorithm>using namespace std;int main(int argc, char *argv[]) { list<int>
2021-12-30 23:07:54 368
原创 系统调用或崩溃
5系统调用或崩溃这是我们进入系统调用(和其他库调用)的部分,这些调用允许您访问Unix框或任何支持套接字应用编程接口的框的网络功能(BSD、视窗、Linux、苹果、你有什么)。)当你调用其中一个函数时,内核会自动接管并为你完成所有工作。大多数人被困在这里的地方是调用这些东西的顺序。在这种情况下,手册页是没有用的,正如你可能已经发现的那样。为了帮助解决这个可怕的情况,我试图在下面的部分中以与你在程序中调用它们完全``*(大约*``)相同的顺序列出系统调用。再加上到处都是一些示例代码,一些牛奶和饼干(我
2021-12-06 20:20:46 1080
原创 C++内存模型和原子类型操作
C++内存模型和原子类型操作std::memory_order初探动态内存模型可以理解为存储一致性模型,主要是从行为上来看多个线程对同一个对象读写操作时所做的约束,动态内存理解起来会有少许复杂,涉及到内存、Cache、CPU的各个层次的交互。如下有两个线程,分别对a、R1、b、R2进行赋值,根据线程执行的顺序可能有以下几种情况在不对线程进行任何限制,线程内部指令不进行重排的情况下。可以有4!/(2!*2!)=6中情况在不考虑优化和指令重排的情况下,多线程有如下两种情况:程序最终执行的结果,是
2021-10-12 21:52:41 311
原创 linux下gdb调试方法和技巧详解
linux下gdb调试方法和技巧整理简介UNIX或者UNIX-like下调试工具启动gdb# 1. 在可执行程序不需要输入参数时,我们可以使用 gdb + 可执行程序 gdb ./typeid_test # 2. 可执行程序需要输入参数时, 我们使用 gdb --args + 可执行程序 + args gdb --args ./MPEG2TransportStreamIndexer1 /work/video/sky.ts # 3. 连接已经运行的程序 gdb -p + pid #
2021-10-11 23:36:32 6581
原创 Go Embed简明教程
Go Embed简明教程go语言程序都是编译成二进制可执行文件的,但是实际执行时除了需要可执行程序,还需要一些静态文件,比如html模板等,于是就有人想如果Go官方能内建支持就好了。2019末一个提案被提出 issue#35950,期望Go官方编译器支持嵌入静态文件。后来Russ Cox专门写了一个设计文档 Go command support for embedded static assets, 并最终实现了它。需要注意的这个功能在go 1.16beta之后才支持对于单个的文件,支持嵌入为
2021-09-26 21:47:00 2576
原创 Linux CPU cache
CPU cache目前的CPU都是有三级缓存,一级二级是每个CPU独有的,三级缓存是所有CPU共有的,其中L1的缓存分为数据缓存和指令缓存,如下图所示:虚拟化: VT-xL1d 缓存: 128 KiB // L1数据缓存L1i 缓存: 128 KiB // L1 指令缓存L2 缓存: 1 MiBL3 缓存
2021-09-20 12:25:26 226
原创 C++库文件导出可见性
导出符号C++中除了语言级别的访问特性(公有、私有和保护)外,还有两个相关的概念允许暴露API中的符号,它们位于物理层次,分别是:外部链接导出可见性外部链接外部链接这个术语是指一个编译单元中的一个符号可以被其他编译单元访问,而导出是只在库文件中可见的符号。只有外部链接才可以导出。我们先看下外部链接,这是决定客户是否可以访问共享库中符号的第一步。特别地,除非采取强制措施,否则.cpp文件中(文件作用域)的全局自由函数和变量会有外部链接。举个栗子:// Uncomment the next
2021-09-19 09:00:08 336
原创 Linux的Page Cache
1. Page Cache何为Page Cache为了了解Page Cache我们可以看一下Linux的文件I/O系统从图中可以看出,Page Cache是由Linux内核进行管理的,而且通过mmap以及bffered I/O将文件读取到内存空间实际上都是读取到Page Cache上的。如何查看系统的Page Cache?通过读取cat /proc/meminfo文件,查看系统实时内存情况。...Buffers: 117572 kBCached: 273
2021-09-11 17:44:01 1366
原创 C++并发编程线程间共享数据std::future和sd::promise
线程间共享数据使用互斥锁实现线程间共享数据为了避免死锁可以考虑std::lock()或者boost::shared_mutex要尽量保护更少的数据同步并发操作C++标准库提供了一些工具 可以用于同步操作,形式上表现为条件变量(condition variables)和期望(futures)C++标准中有两套实现std::condition_variable和std::condition_variable_any这两个实现都包含在<condition_variable>头文件中,前
2021-09-04 00:07:54 426
原创 使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件)
使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件)使用beep播放mp3文件(10num)使用go语言GUI库fyne实现音乐播放器要是想使用go语言实现播放mp3需要借助beep库,在github上有已经开源的库路径如下:beep库文件路径下面的代码只是实现了简单的播放功能,没有暂停和快进的功能package mainimport ( "github.com/faiface/beep" "github.com/faiface/beep/mp3" "gi
2021-08-25 22:25:36 2014
原创 使用go语言GUI库fyne绘制一个交通标志
绘制一个交通标志首先实现一个函数makeSign(),该函数返回fyne.CanvasObject对象,对象中实现所有的图形func makeSign() fyne.CanvasObject { bg := canvas.NewCircle(color.NRGBA{R: 255, A: 255}) bg.StrokeColor = color.White bg.StrokeWidth = 5 bar := canvas.NewRectangle(color.White)
2021-08-24 23:28:38 611
原创 golang的GUI库,使用go-fyne设计一个代办事项APP
Designing task list我们在这一节中将会设计一个,左边是列表,右边列表中代办事项的具体内容实现效果如图:实现该需要使用总共用了两个文件,一个task_list.gopackage mainimport ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" "ti
2021-08-16 23:12:37 2151
原创 C++内存模型和原子类型操作
C++内存模型和原子类型操作std::memory_order初探动态内存模型可以理解为存储一致性模型,主要是从行为上来看多个线程对同一个对象读写操作时所做的约束,动态内存理解起来会有少许复杂,涉及到内存、Cache、CPU的各个层次的交互。如下有两个线程,分别对a、R1、b、R2进行赋值,根据线程执行的顺序可能有以下几种情况在不对线程进行任何限制,线程内部指令不进行重排的情况下。可以有4!/(2!*2!)=6中情况在不考虑优化和指令重排的情况下,多线程有如下两种情况:程序最终执行的结果,是
2021-08-15 21:06:23 532
原创 万字长文带你一文读完Effective C++
Effective C++视C++为一个语言联邦STL Template C++ C Object-oriented C++一开始C++只是C加上一些面向对象特性,但是随着这个语言的成熟他变得更加无拘无束,接受不同于C with classes的各种观念、特性和编程战略。异常对函数的结构化带来了不同的做法,templates将我们带来到新的设计思考方式,STL则定义了一个前所未见的伸展性做法。今天C++已经是个多重范型编程语言,一个同时支持过程形式、面向对象形式、函数形式、泛型形式、元编程形式
2021-08-10 20:15:40 1092
原创 Implicit Move Must Go
Implicit Move Must Go– 转载出处Document Number: N3153=10-0143Document Date: 2010-10-17Author: Dave Abrahams dave@boostpro.comWhat is Implicit Move?In N2855, the authors described a surprising effect that occurs when “legacy” C++03 types are combined in t
2021-07-22 09:06:34 489
原创 移动语义-右值引用一文弄懂带你一探究竟
C++ 右值引用block://6984617523950616580?from=docs_block&id=ce31003ceb5efb1f7a7c0a5fbe6cb60191627a38右值的引入作为在C++11中引入的一个类型,容易引起误解的是,右值引用并没有说明引入是为了什么,是为了解决什么问题。右值引用可以解决以下问题实现移动语义完美转发左值和右值来自原先的C语言,左值可以出现在赋值左边或者右边,而右值只能出现在赋值的右边int a = 42;int b = 4
2021-07-18 16:20:08 397 1
原创 一文读懂什么是C++移动语义《一》
C++ 右值引用block://6984617523950616580?from=docs_block&id=ce31003ceb5efb1f7a7c0a5fbe6cb60191627a38右值的引入作为在C++11中引入的一个类型,容易引起误解的是,右值引用并没有说明引入是为了什么,是为了解决什么问题。右值引用可以解决以下问题实现移动语义完美转发左值和右值来自原先的C语言,左值可以出现在赋值左边或者右边,而右值只能出现在赋值的右边int a = 42;int b = 4
2021-07-15 23:07:56 289 2
原创 使用fyne绘制一个交通图标
fyne绘制一个交通标志首先实现一个函数makeSign(),该函数返回fyne.CanvasObject对象,对象中实现所有的图形func makeSign() fyne.CanvasObject { bg := canvas.NewCircle(color.NRGBA{R: 255, A: 255}) bg.StrokeColor = color.White bg.StrokeWidth = 5 bar := canvas.NewRectangle(color.Whi
2021-07-13 23:23:30 743
原创 live555实现视频格式数据流化处理
MPEG2TransportStreamIndexerMPEG2TransportStreamIndexer主要实现了对视频数据流化,要想实现对视频的点播,要同时具备.ts和.tsx文件,MPEG2TransportStreamIndexer示例代码可以完成这个过程。其中用到的类的继承关系如下:将ts流化需要四个主要的步骤,分别为:打开要流化的视频文件根据打开的文件创建index打开流化之后文件的输出开始每取一帧视频数据转换为流之后输出到输出文件中,重复直到文件结束具体实现如下://
2021-07-04 14:29:17 458
原创 EffectiveC++编程的50个建议
视C++为一个语言联邦一开始C++只是C加上一些面向对象特性,但是随着这个语言的成熟他变得更加无拘无束,接受不同于C with classes的各种观念、特性和编程战略。异常对函数的结构化带来了不同的做法,templates将我们带来到新的设计思考方式,STL则定义了一个前所未见的伸展性做法。今天C++已经是个多重范型编程语言,一个同时支持过程形式、面向对象形式、函数形式、泛型形式、元编程形式的语言。这些能力和弹性使C++成为一个无可匹敌的工具,因此、将C++视为一个语言联邦。尽量以cosnt、enu
2021-06-14 22:54:29 314 2
原创 C++优化热点语句
优化热点语句提前计算固定值先观察下面的性能测试代码:static void find_blank(benchmark::State& state) { for (auto _: state) { char s[] = "This string has many space (0x20) chars. "; for (size_t i = 0; i < strlen(s); ++i) if (s[i] == ' ')
2021-05-31 23:26:56 467 1
原创 最简单的方式实现一棵二叉树
使用最简单的方式实现看树写代码C++实现这段代码之所以能够正常工作,是因为数组元素的地址是常量表达式。我们可以使用这种标记法定义任何链式结构,但是这种初始化方法难以记住,所以在构建这种结构时很容易出现编码错误。//// Created by andrew on 2021/5/29.//#include <iostream>using namespace std;int main(int argc, char* argv[]) { // 看着图就可以手上写一个二叉树
2021-05-29 12:07:51 156
The Robert C. Martin Clean Code Collection - Martin, Robert C-.m
2023-08-15
Technical Overview of LoRa and LoRaWAN-TÜV Rheinland
2023-08-15
Getting Started with LevelDB-Andy Dent
2023-08-15
Alice and Bob: A History Of The World’s Most Famous Couple
2023-08-07
福昕阅读器--linux最新版
2020-11-14
dbeaver-ce_7.2.4_amd64最新版本|dbeaver-ce_7.2.4_amd64.deb
2020-11-14
最新GeoLite2资源整合.zip
2020-10-03
C++基础课程讲义.pdf
2020-09-26
strtok的赞歌.pdf
2020-04-19
bsearch.zip
2020-04-18
RFC2616中文翻译-有待改进.odg
2020-01-15
Sqlite3.pdf
2019-06-30
GDB就该这样用
2019-05-04
IPC进程间通信
2019-05-03
在ubuntu上配置ftp服务器的说明文档,亲测可用(图片)
2018-08-26
自己参考网上的资源配置的vim编译器配置文件
2018-08-25
配置samba服务器的配置文件备份
2018-08-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人