X86 Linux 下 SIGBUS 总结
摘要:SIGBUS 在 x86 Linux 上并不多见,但一旦出现,其调用堆栈常常让人摸不着头脑,加之信号问题各平台系统间差异较大,更让人难以理清,这里稍微总结一下 x86 Linux 上大概有哪些情形会触发 BUS ERROR. 文件映射访问异常 这是 SIGBUS 在用户态最为常见的场景,也最容易触发
阅读全文
posted @
2019-06-05 07:59
twoon
阅读(7759)
推荐(0) 编辑
一种高效的 vector 四则运算处理方法
摘要:实现 vector 的四则运算 这里假设 vector 的运算定义为对操作数 vector 中相同位置的元素进行运算,最后得到一个新的 vector。具体来说就是,假如 则, 等于 。实现这样的运算看起来并不是很难,一个非常直观的做法如下所示: 有了这个类,我们就可以把一个简单的运算表达式的结果封装
阅读全文
posted @
2016-07-17 02:03
twoon
阅读(10077)
推荐(4) 编辑
左值右值的一点总结
摘要:再次来写左值右值相关的东西我的内心是十分惴惴不安的,一来这些相关的概念十分不好理解,二来网上相关的文章实在太多了,多少人一看这类题目便大摇其头,三来也怕说不清反而误导了别人,反复纠缠这些似乎无关大雅的语言细节实在也有成为 language lawyer 之嫌。但我还是决定再总结一次,因为这是我一直以
阅读全文
posted @
2015-12-11 16:50
twoon
阅读(7012)
推荐(2) 编辑
实现一个 Variant
摘要:很多时候我们希望能够用一个变量来保存和操作不同类型的数据(比如解析文本创建 AST 时保存不同类型的结点),这种需求可以通过继承来满足,但继承意味着得使用指针或引用,除了麻烦和可能引起的效率问题,该做法最大的不便还在语义上,指针和引用都不是值类型。于是我们想到 union,union 对简单类型来说...
阅读全文
posted @
2015-10-26 18:02
twoon
阅读(3955)
推荐(1) 编辑
c++ 全局变量初始化的一点总结
摘要:注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。##**什么时候初始化**根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译...
阅读全文
posted @
2015-03-05 23:12
twoon
阅读(44867)
推荐(13) 编辑
再说 c++11 内存模型
摘要:##**可见性与乱序**在说到内存模型相关的东西时,我们常常会说到两个名词:乱序与可见性,且两者经常交错着使用,容易给人错觉仿佛是两个不同的东西,其实不是这样,他们只是从不同的角度来描述一个事情,本质是相同的。比如说,我们有如下代码:```cppatomic g_payLoad = {0};atom...
阅读全文
posted @
2014-12-12 16:45
twoon
阅读(8172)
推荐(1) 编辑
c++ 模板元编程的一点体会
摘要:趁着国庆长假快速翻了一遍传说中的、大名鼎鼎的 *modern c++ design*,钛合金狗眼顿时不保,已深深被其中各种模板奇技淫巧伤了身。。。论语言方面的深度,我看过的 c++ 书里大概只有 *insight c++ object model* 能与之一战吧?难怪 Herb 老喜欢调侃 Andr...
阅读全文
posted @
2014-10-04 22:57
twoon
阅读(11585)
推荐(0) 编辑
小试 boost spirit
摘要:解释文本文件是日常编程中太平常的一件事情了,一般来说,土鳖点的做法可以直接手写 parser 用循环暴力地去 map 文本上的关键字从而提取相关信息,想省力一点则可以使用 tokenizer 或正则表达式之类的工具,无论怎样,总的来说,手写 parser 去解释文本基本是件苦力活:写出的代码比较难重...
阅读全文
posted @
2014-08-23 19:38
twoon
阅读(8397)
推荐(2) 编辑
DWARF 中的 Debug Info 格式
摘要:本周花了几天的时间来研究怎么在 breakpad "[1" , "2" ] 中加入打印函数参数的功能,以期其产生的 callstack 更具可读性,方便定位崩溃原因。现代 ELF 中的调试信息基本是以 DWARF 格式为主了,因此这几天的研究也主要将时间花在了理解 DWARF 这货是怎么工作上,感叹...
阅读全文
posted @
2014-08-03 18:15
twoon
阅读(13100)
推荐(1) 编辑
linux 下动态链接实现原理
摘要:符号重定位 讲动态链接之前,得先说说符号重定位。 c/c++ 程序的编译是以文件为单位进行的,因此每个 c/cpp 文件也叫作一个编译单元(translation unit), 源文件先是被编译成一个个目标文件, 再由链接器把这些目标文件组合成一个可执行文件或库,链接的过程,其核心工作是解决模块间各
阅读全文
posted @
2014-07-27 21:28
twoon
阅读(19293)
推荐(7) 编辑
c++11 内存模型解读
摘要:关于乱序 说到内存模型,首先需要明确一个普遍存在,但却未必人人都注意到的事实:程序通常并不是总按着照源码中的顺序一一执行,此谓之乱序,乱序产生的原因可能有好几种: 1. 编译器出于优化的目的,在编译阶段将源码的顺序进行交换。
2. 程序执行期间,指令流水被 cpu 乱序执行。
3. inhe...
阅读全文
posted @
2014-06-29 17:37
twoon
阅读(13836)
推荐(3) 编辑
模板中的名字查找问题
摘要:问题起源 先看下面很简单的一小段程序。 这段代码在 GCC 下很意外地编译不过,原因竟然是找不到 fun 的定义,可是明明就定义在基类中了好吗!为什么视而不见呢?显然这和编译器对名字的查找方式有关,那这里面究竟有什么玄机呢?上述代码是写得不规范,还是 GCC 竟然存在这样愚蠢而又莫名其妙的 bug...
阅读全文
posted @
2014-06-15 16:29
twoon
阅读(1994)
推荐(0) 编辑
基于ε-NFA的正则表达式引擎
摘要:正则表达式几乎每个程序员都会用到,对于这么常见的一个语言,有没有想过怎么去实现一个呢?乍一想,也许觉得困难,实际上实现一个正则表达式的引擎并没有想像中的复杂,《编译原理》一书中有一章专门讲解了怎么基于状态机来构建基本的正则表达式引擎,它讲这个初衷是为词法分析服务,不过书里的东西相对偏理论了些,实现起...
阅读全文
posted @
2014-05-17 20:03
twoon
阅读(9311)
推荐(1) 编辑
c++ 异常处理(2)
摘要:前面一篇博文简单介绍了 c++ 异常处理的流程,但在一些细节上一带而过了,比如,_Unwind_RaiseException 是怎样重建函数现场的,Personality routine 是怎样清理栈上变量的等,这些细节涉及到很多与语言层面无关的东西,本文尝试介绍一下这些细节的具体实现。 相关的数据
阅读全文
posted @
2014-04-07 21:57
twoon
阅读(10863)
推荐(8) 编辑
实现一个简单的C++协程库
摘要:之前看协程相关的东西时,曾一念而过想着怎么自己来实现一个给 C++ 用,但在保存现场恢复现场之类的细节上被自己的想法吓住,也没有深入去研究,后面一丢开就忘了。近来微博上看人在讨论怎么实现一个 user space 上的线程库,有人提到了 setcontext,swapcontext 之类的函数,说可...
阅读全文
posted @
2014-03-22 19:11
twoon
阅读(16244)
推荐(7) 编辑
c++ 异常处理(1)
摘要:异常 (exception) 是 c++ 中新增的一个特性,它提供了一种新的方式来结构化地处理错误,使得程序可以很方便地把异常处理与出错的程序分离,而且在使用上,它语法相当地简洁,以至于会让人错觉觉得它底层的实现也应该很简单,但事实上并不是这样。恰恰因为它语法上的简单没有规定过多细节,从而留给了编译
阅读全文
posted @
2014-03-19 22:08
twoon
阅读(25522)
推荐(5) 编辑
一个浮点数计算的问题
摘要:同事在工作中遇到了一个与浮点数运算相关的奇怪问题,值得一记,该问题涉及代码摘要如下: 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 double s = 6.0; 7 double e = 0.2; 8 9 cou
阅读全文
posted @
2014-03-17 00:33
twoon
阅读(5099)
推荐(0) 编辑
c++11 中的 move 与 forward
摘要:[update: 关于左值右值的另一点总结,请参看这篇] 一. move 关于 lvaue 和 rvalue,在 c++11 以前存在一个有趣的现象:T& 指向 lvalue (左传引用), const T& 既可以指向 lvalue 也可以指向 rvalue。但却没有一种引用类型,可以限制为只指向
阅读全文
posted @
2014-01-07 23:07
twoon
阅读(33956)
推荐(11) 编辑
c++中的左值与右值
摘要:左值(lvalue)和右值(rvalue)是 c/c++ 中一个比较晦涩基础的概念,不少写了很久c/c++的人甚至没有听过这个名字,但这个概念到了 c++11 后却变得十分重要,它们是理解 move/forward 等新语义的基础。 左值右值的定义 左值与右值这两概念是从 c 中传承而来的,在 c
阅读全文
posted @
2014-01-01 16:59
twoon
阅读(112938)
推荐(19) 编辑
boost bind及function的简单实现
摘要:前面在做 http server 的时候,需要做一个回调的接口,要求能够绑定类的函数以及普通的函数到这个回调里,对于这种应用要求,选择 boost 的 bind 和 function 是最合适不过了,但现在情况有些不同,我不准备在现在做的这个东西里加入 boost, 本着以造轮子为乐的精神,现在只能...
阅读全文
posted @
2013-12-25 12:16
twoon
阅读(6009)
推荐(2) 编辑