《Effective Modern C++》条款10:优先选用enum class,而非enum

简述

众所周知,使用C++98中的枚举型别定义的枚举量,会泄漏到枚举型别所在的作用域中,这也意味着在此作用域内不能再有其他实体取相同的名称。因此,C++98中的枚举型别又称之为:不限作用域的枚举型别。

C++11为了解决这一问题,引入了限定作用域的枚举型别。由于限定作用域的枚举型别是通过”enum class“声明的,所以有时它们也被称为枚举类。

Read more

《Effective Modern C++》条款1:理解模板型别推导

简述

一个函数模板的声明和调用大致形如:

1
2
3
4
5
6
// 声明
template<typename T>
void f(ParamType param); // ParamType表示形参型别

// 调用
f(expr); // expr表示调用时传入的实参

模板型别推导的结果,不仅依赖于传入实参的型别,还依赖函数形参的型别。

Read more

整数求均值的几种方法

问题描述:

求均值最常用的方法是将两数相加再除以2,但是当两个数都大于其最大值的一半时,

相加的结果会发生内存移除。比如:

1
2
3
4
5
unsigned average(unsigned a, unsigned b)
{
return (a + b) / 2;
}
average(0x8000'0000 + 0x8000'0000) = 0; // 内存溢出
Read more

表达式:x=x&(x-1)的含义

表达式x = x & (x - 1)的含义是:

每执行一次,就会把x二进制格式下最右边的1变为0,换言之就是该表达式有效的执行次数等于x二进制格式下1的个数。

Read more

表达式:x & (-x)的含义

表达式:x & (-x)的含义:

返回x在二进制下的最右边的1表示的值:

  • 如果x是偶数,返回值能整除x且该值一定是2的n次幂,即能整除x的最大的2的n次幂
  • 如果x是奇数,返回值一定是1.
Read more

memset函数的使用陷阱

memset是C/C++编程中常用的函数,一般用于申请内存后的初始化操作,比如:

1
2
char* buffer = (char*)malloc(1024);
memset(buffer, 0x0, 1024);

memset接收三个参数:

  • 第一个参数是开始填充的地址
  • 第二个参数是填充的byte
  • 第三个参数要填充的字节数(注意是字节数)

这个函数看似简单,但是如果使用不当则会导致一些未知的bug。以下是目前遇到的几个陷阱。

Read more

《如何阅读一本书》读书笔记

种一棵树最好的时候的是十年前,其次就是现在

如何阅读一本书?这是一个一直困扰我的难题。几年前有幸拜读了莫提莫·J·艾德勒和查尔斯·范多伦写的《如何阅读一本书》。但是这本书本身的阅读难度不小,所以阅读过程感觉如鲠在喉一般的难受,看完之后仍然对书中提及的阅读方法论一知半解。今天在网路上看到了一份关于阅读方法的PPT文案,里面提及的方法恰好是对这本书的概括与总结。下面内容是我对这篇文稿的摘要与理解。

Read more

《三体1》读后感之死亡还是生存

《三体》是我看的第一本科幻小说,与很多在学生时期就接触了这本书的朋友比起来,即将三十而立的我觉得有点相见恨晚。书中涉及了天文学、物理学、计算机学等众多专业知识。在阅读这本书的过程中,总会时不时地感叹作者想象力之丰富,知识之渊博。与作者刘欣慈一样同为程序员的我读起来多了一丝亲切感。过去的自己对科幻小说存在一些误解,认为科幻小说无非只是天马行空的想象罢了,这类超现实的小说只适合用来消遣,并没有太多实用性。现在我为自己愚蠢的想法道歉:一本好的小说一定都蕴含着一个深刻的内核,或是对生命的思考,或是对人性的剖析等等。而小说的功能则是通过虚构一个故事或世界让读者更好的理解作者要表达的想法,并引导读者产生共鸣。《三体》这本书在我看来,它提出的是对人类的究极拷问:生存还是死亡?

Read more

关于时间管理的一点理解

最近时间管理方面又出现问题,感觉做事的效率明显下降很多。在知乎上看到李开复先生关于时间管理的文章,觉得很有感触,遂做一些笔记以自省。

Read more