摘要:
本文例子均在 Linux(g++)下验证通过,CPU 为 X86-64 处理器架构。所有罗列的 Linux 内核代码也均在(或只在)X86-64 下有效。 本文首先通过范例(以及内核代码)来解释 Memory barrier,然后介绍一个利用 Memory barrier 实现的无锁环形缓冲区。 Memory barrier 简介 程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一... 阅读全文
摘要:
没有学过代码编译的原理,以前也没有兴趣去学编译器的相关原理,但是近期通过阅读google开源项目gtest,对我稍有触动。 代码: main test示例 TEST宏定义 #define TEST(test_case_name, test_name)\GTEST_TEST_(test_case_name, test_name, \::testing::Test, ::testing... 阅读全文
摘要:
const关键字是C++中常用的类型修饰符,用法非常灵活,使用const将大大改善程序的健壮性。 const的作用 1. 定义const常量; 比如: const int Max = 100; 2. 便于类型检查; const 常量有数据类型,而宏常量没有数据类型。 编译器对前者进行类型安全检查; 对后者只进行字符替换,没有类型安全检查,在字符替换时可能会产生意料不到的错误。 ... 阅读全文
摘要:
序 声明和定义是我们使用的基础,但是对于声明和定义的概念,我们不甚了了,也就是说感觉好像是这样,但是真要详细说明就说不上来。 有博主对于声明和定义有以下描述: 1、需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。 “定义性声明(defining declaration)”或者称为“定义(definition)”。 2、不需要建立存储空间的。 例如:extern ... 阅读全文
摘要:
序 算法的复杂性体现在运行该算法时所需的计算机资源多少,而计算机资源最重要的是时间和空间。算法复杂度分为时间复杂度和空间复杂度。 一个高级语言编写的程序在计算机上运行所消耗的时间取决于下列因素: 1、算法采用的策略、方案 2、编译产生的代码质量 3、问题的输入规模 4、机器执行指令的速度 抛开与计算机硬件、软件有关的因素,一个程序的运行时间依赖于算法的好坏和问题的输入规模。 时间... 阅读全文
摘要:
字符串化操作 # http://msdn.microsoft.com/en-US/library/7e3a913x(v=vs.80).aspx 注意: 宏中遇到#或##时就不会再展开宏中嵌套的宏了 code: 1: #define STRING(x) #x 2: printf("%s\n", STRING(__FILE__)); /*指向"__FILE__"而不是"... 阅读全文