摘要:尽量不要在你的程序中使用无符号类型,以免增加不必要的复杂性,尤其不要仅仅因为无符号类型不存在负数(比如年龄)而使用它来表示数值。 尽量使用像int那样的有符号数,这样在涉及混合类型操作(比如比较有符号数和无符号数)的时候不必担心边界情况(比如-1会被提升为一个非常大的正数)。 只有在使用位段和二进制掩码的时候才使用无符号数。 如果要混合操作有符号数和无符号数,应在表达式中使用强制类型转换,使它们同时为有符号数或无符号数,这样,就不必由编译器来选择结果的类型。
阅读全文
随笔分类 - C/C++
摘要:gtest的浮点数比较断言关于浮点数的比较,我们知道不能直接用==比较,除此之外,有比较绝对误差和相对误差以及转换为整数比较,http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm对浮点数的比较写得很详细。gtest使用的是将sign-and-magnitude representation 转为biased repesentation,然后再进行比较,而不是使用二进制补码的方式进行比较,这样可以不用管浮点数里的指数段表示法。关于这几种表示方法,可以在http://en.wikipedia.org/wi
阅读全文
摘要:GCC 提供的原子操作gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。其声明如下:[代码]这两组函数的区别在于第一组返回更新前的值,第二组返回更新后的值。type可以是1,2,4或8字节长度的int类型,即:[代码]后面的可扩展参数(...)用来指出哪些变量需要memory barrier,因为目前gcc实现的是full barrier(类似于linux kernel 中的mb(),表示这个操作之前的所有内存操作不会被重排序到这个操作之后),所以可以略掉这个参数。[代码]这两个函数提供原子的比较和交换,如果*ptr == oldval,就将
阅读全文
摘要:LIKELY和UNLIKELY的一般定义如下:#define LIKELY(x) (__builtin_expect(!!(x),1))#define UNLIKELY(x) (__builtin_expect(!!(x),0))为什么要使用两个叹号呢?取两次非主要是为了顺利的和0或1进行比较。
阅读全文
摘要:有一个类,其中有个接口被重载,如下:[代码]想要对addItems进行测试,但不想为每个重载函数写一遍相同的测试用例。最开始想用TestWithParam,但发现行不通,否决。因为重载函数的个数基本确定,所以决定使用TYPED_TEST_CASE,如下:[代码]为什么要使用vector<any>呢?如果使用vector<T>,那么在编译时会出错,想像一下T是int的情况,那...
阅读全文
摘要:关于valgrind的 “Conditional jump or move depends on uninitialised value(s)”:valgrind在报这个错误的时候程序未必有bug,如下例:代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHigh...
阅读全文

浙公网安备 33010602011771号