自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 C++ 移动构造函数在vector扩容时的场景

这是为什么呢,原来STL在选择调用移动构造函数还是拷贝构造函数时,首先要考虑的是,已经存在的元素能否安全地从老的内存空间转移到新的内存空间,一般来说拷贝会比移动更加安全一点,所以在同等情况下会优先考虑用拷贝构造函数。考虑一个场景:vector里面的元素是类的对像,并且该类的对象提供移动构造函数,那么当vector扩容时,需要把元素从老的内存空间移动到新的内存空间,那么此时STL会调用移动构造函数吗?编译:g++ test.cpp -o test。

2023-10-20 23:55:01 195 1

原创 函数式编程总结

函数式编程的概念函数式编程理念来自于数学中的函数。函数的概念:对于两个变量x和y,如果每给定x的一个值,都有一个y值与之对应,那么我们就说y是x的函数。如下即是一些函数:f(x)=5x^2+4x+3g(x)=2f(x)+5=10x^2+8x+11h(x)=f(x)+g(x)=15x^2+12x+14这种只关心输入数据和输出数据的关系,即数学表达式里面说的mapping关系的编程模式叫做函数式编程。对于函数式编程来说,x是输入数据,y是输出数据。函数式编程的特点:stateless

2022-05-25 22:40:17 385

原创 架构简洁之道之解耦模式

Pointers和references看起来很不一样,但它们似乎做类似的事情。首先你必须认知一点,没有所谓的null reference.一个reference总代表某个对象。所以如果你有一个变量,其目的是用来指向(代表)另一个对象,从早到晚 也有可能它不指向(代表)任何对象,那么你应该使用pointer,因为你可以将pointer设置为null.换个角度看,如果这个变量总是必须代表一个对象,也就是说如果你的设计并不允许这个变量为null,那么你应该使用reference....

2022-05-04 21:57:33 706

原创 More Effective C++条款10:在constructors内阻止资源泄露

想像你正在开发一个多媒体通信薄软件,这个软件可以放置包括人名, 地址,电话号码等文字,以及一张个人相片和一段个人声音。为了简单起见,本文中假设只包含个人相片和声音。代码实现下:#include <stdio.h>#include <iostream>using namespace std;class Image{public: Image(const string& imageDataFileName) { printf("Image constr

2022-04-07 00:47:03 623

原创 More Effective C++条款9:利用destructors避免泄露资源

1C++为什么要引入exception?因为exception无法被忽略。如果一个函数利用“设定状态变量”的方式或是利用“返回错误码”的方式发出一个异常信号,无法保证此函数的调用者会检查那个变量或检验那个错误码(特别是当需要判断返回值的地方特别多的时候,很难每一次调用都去判断一下返回值,并且如果每次调用都去判断返回值的话,会让代码显得啰嗦)。于是程序的执行可能会一直继续下云,远设错误发生地点。但是如果函数以抛出exception的方式发出异常信号,而该exception未被捕捉,程序的执行便会立该中止。

2022-04-05 21:37:06 1068

原创 C++11bind总结

bind函数的使用详解可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。调用bind的一般形式:auto newCallable = bind(callable,arg_list);`其中,newCallable本身是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的callable的参数。即,当我们调用newCallable时,newCallable会调用callable,并传给它arg_list中的参数。

2022-03-28 00:25:38 342

原创 数据构结之数组总结

数据构结之数组总结

2022-03-16 22:09:09 339

原创 C++11移动语义解析

C++11移动语义解读

2022-03-14 23:02:10 1734

原创 从控制和逻辑的角度看代码复杂度

1976 年,瑞士计算机科学家,Algol W,Modula,Oberon 和 Pascal 语言的设计师 Niklaus Emil Wirth写了一本非常经典的书《Algorithms + Data Structures = Programs》 ,即算法 + 数据结构 = 程序。这本书主要写了算法和数据结构的关系,这本书对计算机科学的影响深远,尤其在计算机科学的教育中。1979 年,英国逻辑学家和计算机科学家 Robert Kowalski 发表论文 Algorithm = Logic + Contr

2022-02-20 22:21:37 526

原创 数据结构之跳表(skip list)

众所周之,二分查找依赖的是数组的随机仿问特性。如果是用链表去存储数据,二分查找就没法使用了吗?实际上,只要对链表稍加改造,就可以支持二分查找。对于一个单链表来讲,即使链表中存储的数据是有序的,如果我们要查找某个数据,也只能从头到尾遍历链表,这样查找效率就很低,时间复杂度就很高,是O(n).那么怎么提高查找效率呢?如果从原始链表中每两个结点中抽取一个作为一个索引,所有的索引组成一个索引层。如下图所示假如现在需要查找数据8,那么第一层索引的比较顺序为1,3,5,7,9. 发现7比8小,9比.

2022-02-17 00:21:49 968

原创 常见软件设计原则总结

常见软件设计原则总结

2021-12-30 22:45:00 214

原创 构造一个简单的操作系统内核,详解进程切换细节

linux kernel 进程调度

2021-12-11 23:06:48 1246

原创 How to design a good API

How to Design a Good API & Why it Matters

2021-11-30 23:49:11 233

原创 疑难杂症之malloc死锁__lll_lock_wait_private

查看glibc源码可知, malloc内部是有锁的。那说明malloc是一个线程安全型函数,但是它不是一个可重入函数。重入的意思是,比如当前线程正在做malloc, 如果此时因为某种原因触发了信号,那么操作系统会保存好现场(正在执行的malloc),转而去执行信号处理函数,如果信号处理函数里面又有malloc的调用,那么此时就发生了malloc重入。当malloc重入时,可能导致线程死锁。main.c 如下:#include <stdio.h>#include <signal.

2021-10-19 00:45:53 5332 2

原创 数据结构之时间轮Timeingwheel以及timer实现

所谓时间轮就是一个循环数组,每过一个时钟周期,数组下标前进一格。每个数组的entry后面挂着一个list, 有点类似于哈希链表。哈希表链表node是因为散列冲突, 时间轮链表node是因为对数组size取模有相同的余数。比如有6个node: 1, 4,7, 10, 13, 16 。数组size = 6, 那么时间轮里的数据如下图所示因为:1,7,13对6做%运算结果都相同4,10, 16对6做%运算结果都相同那么怎么用时间轮去实现一个timer呢,算法如下:list node 存储.

2021-09-27 23:19:07 492

原创 container of的用法

container_of : 在已知一个结构体的成员的名字,以及其地址的情况向,反推该结构体的首地址offsetof : 获取一个结构体成员在结构里面的偏移结构体首地址 = 成员地址- 成员偏移以下是一个例子:#include <stdio.h> #include <stdlib.h>#define offsetof(TYPE,MEMBER) ((int) &((TYPE *)0)->MEMBER) //为什么这样就能得到偏移?#def

2021-09-27 01:10:57 414

原创 X86上汇编寻址方式总结

1 寄存器寻址movl %eax, %edx edx = eax;将寄存器eax赋值给edx2 立即数寻址movl $0x123, %edx edx = 0x123将一个立即数放入寄存器3 直接寻址movl 0x123, %edx edx =*(int32_t*)0x123将一个立即数所指的地址中的内容放到寄存器4 间接寻址movl (%ebx), %edx edx = *(int32_t*)ebx;将一个寄存器内容(地址)所在的内容...

2021-09-14 23:32:14 788

原创 C++引用的本质

C++中引用的本质即是指针. 当申明一个指向其它变量的引用时, 比如int b = &a,编译器偷偷地创建了一个变量,该变量会存储其引用的对象(a)的指针。并且一切对变量b操作,都变转变为对a指针的操作。然而编译器屏蔽了这一切,让使用者感觉一切都是“免费”的。#include <stdio.h>int main(){ int a = 10; int &b = a; int *c = &b; b = 11; retur.

2021-09-02 00:20:29 1001

原创 C++中的new和delete

扒一扒C++中各种不同的new和delete前言:众所周知,C++中的操作符new和delete是用来动态分配内存初始化对象和手动回收内存析构对象的。但这只是最基本最常用的用法。new和delete其实还有更内涵的东西。1 区分各种不同的newnew操作符其实分为三种:new operator ,operator new ,以及placement new。1.1 new ope

2012-09-02 23:08:24 261

原创 More effective C++笔记(1)----隐式转换与临时变量

(1)隐式转换发生的时机:当传递给操作符或者函数的参数与指定类型不匹配时,编译器将会“偷偷地”进行转换,此时就是发生了隐式转换。 (2)隐式转换发生的条件:     (a)编译器原来就支持地转换:比如float型向int型转换,子类的对象(指针)向父类的对角(指针)转换,非const对象(指针)向const对象(指针)转换等等。     (b)当有类型转换操作符的时候。如果类型匹配

2012-05-28 22:38:44 452

通用有限状态机(FSM: Finite-state machine)自动代码生成器

通用有限状态机(FSM: Finite-state machine)自动代码生成器. 可以根据配置文件,自动生成状态机代码(C++)。配置文件中只需要定义状态,跃迁条件。然后完善每个状态的动作即可。省去开发过程中手写状态机的麻烦。并且功能强大,支持大部分状态机,适用性强。且状态机提供了获取当前事件,获取当前状态,以及获取之前的状态,非常的容易去实现自己的逻辑。资源包包括:代码生成器*1, 配置文件*1, Demo示例*1, ReadMe*1,生成的状态机文件*1。非常容易上手,一看即明白。

2023-12-27

空空如也

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

TA关注的人

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