Jinlong's Blog

副业造轮子


  • 首页

  • 文章

  • 随笔

  • 关于
Jinlong's Blog

RValue Reference

发表于 2018-03-30

In C++, there are rvalues and lvalues. An lvalue is an expression whose address can be taken, a locator value–essentially, an lvalue provides a (semi)permanent piece of memory. You can make assignments to lvalues.
An expression is an rvalue if it results in a temporary object.

比如说:

1
2
3
4
5
6
7
8
int a = 1;
string b = 'lijinlong';
int& getRef()
{
return a;
}
getRef() = 3;

其中a、b、getRef()都是lvalue。

1
2
3
4
5
6
string getName()
{
return "lijinlong";
}
getName();
string str(string("hahaha"));

getName()、string(“hahaha”)是rvalue。

C++11引入了RValue Reference,可以这样定义:

1
typename&& ref;

引入RValue Reference的目的是为了避免对临时变量不必要的复制。一般用在构造函数或者是=重载函数的参数上。
标准库中提供了std::move(lvalue)函数来把一个lvalue转换成一个rvalue。详细用法以及需要注意的问题见参考。

参考:
Move semantics and rvalue references in C++11

Jinlong's Blog

C++ Object Model

发表于 2018-03-30

C++类的内存布局如下:
/uploads/object_model.jpeg
当类存在虚函数的时候,类的内存布局中将会多出一个vptr的虚函数表指针,其指向的不仅仅有虚函数表,还包括成员变量的类型信息。如果是单继承,那类的内存布局将会是下面这样的:
/uploads/single_inherit.jpeg
如果是多继承,内存布局是这样的:
/uploads/multiple_inherit.jpeg
上面几幅图的布局作为参考,不同的编译器实现会不同。

参考:
Inheritance in C++

Jinlong's Blog

关于公司

发表于 2018-03-29

青睐每一家Engineering Driven却又不坑员工的公司。

Jinlong's Blog

c++11的condition_variable

发表于 2018-03-22

C++11提供了一种类似于二值信号量的condition_variable,用法如下:

1
2
3
4
5
6
7
/* thread A */
cv.notify_one();
// or cv.notify_all();
/* thread B */
cv.wait();
// or cv.wait_for()、cv.wait_util()

Reference:
C++11 condition_variable

Jinlong's Blog

MTU和MSS

发表于 2018-03-17

MTU(Maximum Transmission Unit)
MSS(Maximum Segment Size)
/uploads/mtumss.png
为防止IP datagram的分片,MTU可通过Path MTU Discovery来调整。
TCP/IP 协议栈中,为什么选择 IP 层负责分片?
WIKIPEDIA: Path MTU Discovery

Jinlong's Blog

开发效率的问题

发表于 2018-03-12

很多人在开始一个陌生的项目的时候,都会觉得难以下手。个人觉得那是因为他们在profiling的时候就想要考虑所有(或者尽可能多)的情况,确保性能、可靠性等可以达到最佳。想法是好的,但是这样却会给我们带来巨大的心理压力,特别是自己一个人在负责一个项目的时候。可能大家也都会有另外一个这样的经历,在对一个已经写好的项目进行性能调优的时候,会显得格外有信心,因为这比重新写一个项目容易多了,只需要修改部分的已有代码就ok了。所以嘛,我觉得在profiling阶段想要考虑尽可能多的性能优化等问题固然好,但是也要有个度,可以先等profiling完成之后或者第一版实现出来之后,再考虑后续的优化。每次一小步,可以让效率提升不少哦。
(只是个人观点,如有雷同,纯属巧合…)

Jinlong's Blog

一个C实现的简洁版coroutine

发表于 2018-03-11

云风大佬写的轻量级coroutine。好简洁啊…
底层实现的系统API为:

  • getcontext()
  • makecontext()
  • swapcontext()

coroutine written by cloudwu

Reference:
getcontext man page
makecontext and swapcontext man page

Jinlong's Blog

虚拟内存以及分页原理

发表于 2018-03-11
  • 每一个进程都需要一个Page Table来保存本进程的虚拟页和物理页的映射关系。如果虚拟内存空间为4GB,一个Page Table Entry为4Bytes,则一个进程的Page Table则要4MB(2GB / 4KB * 4Bytes)的空间来存储,这个空间成本的开销是非常大的。
  • 为了解决这个问题,引入了2级(多级)Page Table,这样内存中只需要存进程的一级Page Table,二级Page Table只有在需要的时候才会被加载到内存,空间成本大大减少,但是却增加了系统处理Page Fault时候的成本(增加了时延)。
  • 为了解决这个问题,引入TLB(Translation Lookaside Buffer)。TLB相当于内存中的Page Table的硬件实现,保存的也是虚拟页到物理页的映射关系。当进程需要访存的时候,会先到TLB找,找不到再走内存中Page Table的路线,并利用LRU规则更新TLB中的内容。

/uploads/page.jpeg
Virtual Memory and Paging

Jinlong's Blog

exit和_exit

发表于 2018-03-11

mark.
exit会调用atexit上注册的函数,但_exit不会。_exit一般用在child process执行exec类函数失败之后。
/uploads/exit.jpeg

Jinlong's Blog

chip8模拟器

发表于 2018-03-09

一个用JavaScript实现的chip8模拟器,会在上面陆续更新chip8平台上的经典游戏。现在已有的游戏有:

  • Pong2
  • Tetris
  • Invaders
  • Pong
  • Tank
  • 15puzzle

项目链接为:
https://kimlongli.github.io/chip8/

Reference:
Chip-8 Technical Reference v1.0

Jinlong's Blog

template中的class和typename

发表于 2018-03-07

为何C++的template中会同时出现class和typename关键字的权威解释
Why C++ Supports both Class and Typename for Type Parameters
Difference of keywords ‘typename’ and ‘class’ in templates?

Jinlong's Blog

使用CRTP

发表于 2018-03-06

Reference里的前三个分别介绍了CRTP的概念、常见用法、以及实现。最后一个为StackOverflow里的高票答案,简单易懂地诠释了CRTP的基本概念以及一些常见用法。都是好文章,值得一看。

Reference:
The Curiously Recurring Template Pattern (CRTP)
What the Curiously Recurring Template Pattern can bring to your code
An Implementation Helper For The Curiously Recurring Template Pattern
StackOverflow: What is the curiously recurring template pattern (CRTP)?

Jinlong's Blog

强一致性算法Raft-分布式的福音

发表于 2018-02-23

Raft的出现预示着被Paxos支配的时代即将结束了,是分布式的福音。
Raft算法简单且好理解,通读Raft论文后,再通过raft.github.io上的raft小工具来进行测试,基本上就可以理解Raft算法的basic版本了。理解Raft并不难,难的是Raft的实现,以及相关的性能优化,比如一次AppendEntry RPC发送尽量多的log entry,使用snapshot技术来优化宕机恢复时间以及减少存储负担,使用尽可能高性能的RPC传输协议(比如Google Protocol Buffer),以及Raft和其它算法(比如分布式事务、bitcask模型等)的友好结合。要把Raft实现出来并且应用到现有的工业生产环境中真的挺难的。毕设入坑ing,望早日弄出来。。。

raft.pdf
raft.github.io

Jinlong's Blog

Naive Bayes Classifier

发表于 2018-02-23

因为
/uploads/nb1.jpeg
所以
/uploads/nb2.jpeg
假设组成事件d的{x1,x2,x3…}相互独立,所以
/uploads/nb3.jpeg
朴素贝叶斯分类在处理文本分类问题(比如识别垃圾邮件)时候效果非常好,且计算高效,当然这里的“计算”不包括样本训练。
p.s 在样本训练阶段,需要选出几千上万个特征词,此时可通过计算特征词的information gain的方法来进行筛选。
naivebayes.pdf

Jinlong's Blog

Entropy和Information Gain

发表于 2018-02-23

Entropy用来判断一个数据集的Impurity,公式如下:
/uploads/entropy.jpeg
Information Gain用来表示一个特征对数据集进行分类的效果,公式如下:
/uploads/info_gain.jpeg
参考:InfoGain.pdf

Jinlong's Blog

Image Kernel

发表于 2018-02-23

如题,并且可以在上面调整参数做不同的实验。
http://setosa.io/ev/image-kernels/

Jinlong's Blog

Windows Inline Function Hooking

发表于 2018-02-23

经典好文。要是能附上DLL Injection部分就更好了。
Windows Inline Function Hooking
/uploads/hook.png

Jinlong's Blog

新的RASPBIAN默认不开启ssh

发表于 2018-02-22

大二时候曾经买过一个树莓派来玩,当时主要是用来做网络文件系统和共享网络用的(树莓派上登录一个的网络账号,然后其它想用网络的人连上去用就ok啦)。后来搁置了一段时间之后,小小的一块板子怎么找也找不到了。前不久突然心血来潮想玩一下硬件,买了一个新的Raspberry PI,在拷入RASPBIAN系统,开机并连上网络之后,用ssh连死活连不上。翻了文档才发现原来新版本的RASPBIAN系统因为安全原因默认不开启ssh服务。需要开启也很简单,在内存卡上拷入RASPBIAN后,在根目录上创建一个空的名为ssh的空文件,这样开机之后ssh服务就默认开启了。
/uploads/ssh1.jpeg
/uploads/ssh2.jpeg

Jinlong's Blog

新的板块

发表于 2018-02-22

新年快乐~~工作之后果然变得好忙呀,好几个月没有写技术博客了。。。什么时候有空补回来。过年无聊hack NexT主题增加了一个随笔版块,内容可能是生活中的一些一闪而过的简短的感想,也可能是看到的非常不错的技术分享(blog、paper等),记录在此作笔记用,也可能是平时遇到的一些坑和吐槽点,or so on。不做分页,需要review的时候使用浏览器的搜索功能即可,看起来还不错哈哈哈。

李金隆

李金隆

18 日志
19 随笔
知乎 E-mail
© 2018 李金隆
由 Hexo 强力驱动
主题 - NexT.Pisces