-
C++内存管理
导入在C++中,我们申请内存一般使用C语言的malloc方式,或者C++的new方式,这两种都是关键字表达式,是我们开发者正常无法介入修改的。但是new其实是可以拆分的,new操作的内部其实是做了三件事: operator new 类型转换 调用构造 其中第一步operator new是可以重载的,因此我们内存管理,主要就是重载operator new,也就是重载void *operator new(size_t size)和对应的 void ope...…
-
关于python多维列表的切片
导入这篇博客主要想聊一下python列表切片,python列表切片不就是一个slice对象吗?还有什么好聊的呢?的确,对于一维的list来说,一个简单的slice对象传入就可以进行切片,比如array[1:100:2]这样,但是对于多维度的list来说,我们不能直接使用多个slice来针对不同维度进行切片,因为list并没没有实现这个功能,多维度在list眼中就是简单的list嵌套。而如果你使用过numpy库,应该知道,对于numpy中的多维数组,我们可以直接针对不同维度进行切片,比如二维...…
-
C++函数重载的背后
导入我们都知道C语言没有函数重载,C++有函数重载,那么有没有想过这背后是怎么实现的呢?主要其实靠一个技术:符号修饰(name mangling)。具体机制符号修饰就是C++会对C++的变量名包括函数名类名等进行符号的修改,比如一个函数声明是这样void func(int a, float b);,那么g++编译器会将函数名修饰成_Z4funcif,其中_Z类似前缀,4是函数名字符数,func一共4个字符,i是int表示第一个参数类型,f是float表示第二个参数类型。再比如一个类成员函数...…
-
C语言和NASM汇编混合编程
导入今天要谈的不是C语言中用asm关键字嵌入汇编,这种一是少见,尤其在现代编译器智能的优化下,更加少见。二是也只是和少量汇编代码的嵌入,今天要谈的是C编译单元和NASM汇编编译单元之间的混合链接。这看起来很简单,其实还是有一些需要注意的地方的,尤其是汇编调用C编写的函数,很容易出问题,为什么呢?因为调用函数其实涉及到函数参数的压栈以及函数栈的开辟和清理。而高级语言下,编译器会根据调用约定(比如__stdcall,_cdecl)自动处理这些,让上层的开发者无需知道内部发生了什么,但是自己实现...…
-
自定义x86中断
思路对于装有操作系统OS的x86系统来说,正常用户模式是没有办法自定义中断的,用户模式提供的软中断只有系统调用,比如int 80h和syscall ,且无法自定义中断号和中断处理函数。但是我们确实可以编写硬中断的处理函数,也就是ISR,中断服务程序,只不过需要内核编程(Linux)或者内核驱动编写(Windows),比如Windows下,利用WDK驱动开发包,绑定IRQ,使用IoConnectIntteruptEx函数可以注册中断服务程序,然后用户态使用DeviceControl函数和驱动...…
-
vim使用技巧
导入今天朋友问我vim好像不好用,为什么这么多人喜欢用。我说让我看看你是怎么用的,结果他就方向键上下左右移动,i 插入,然后退格慢慢删除单词,再修改成新的单词,然后esc :wq保存。我说这就难怪不好用了,不过好歹他还知道使用多行复制和粘贴。所以今天我就想写篇博客,简单介绍几个我觉得vim中非常好用的命令和技巧,不涉及任何的插件,vim的插件是非常强大的,但是不用插件,vim已经足够好用。正文 i和a的使用 这里我说的并不是插入命令的i和a,而是配合c,d,v,y命令的i和...…
-
简单匿名聊天室的实现
导入聊天室的架构还是常见的C/S架构,匿名聊天室的特点主要有三点: 匿名性:连接时分配随机ID(如”用户123”) 实时性:采用I/O多路复用技术 轻量级:单线程处理所有连接 为什么不采用多线程?因为多线程的开销很大,对于小项目无所谓,如果是针对“C10K”级别甚至以上的连接的大项目,多线程很难实现。即使采用线程池也是一样,线程池只是节省了线程创建和销毁的开销,但是节省不了线程切换的开销,而线程切换恰恰是线程模型性能损耗比较大的地方。而多路IO复用,...…