01float和double表示范围和精度
范围:float的指数范围为-127--128,double的范围是-1023-1024。
负指数决定了绝对值最小的非零数,正指数决定了绝对值最大的数。也即决定了范围。
也即float的范围为-2^128-2^128,double的范围是-2^1024-2^1024。
精度:float和double的精度是由尾数位决定的。浮点数在内存中是按照科学计数法来存储的,其整数部分始终是一个隐藏着的1。由于他是不变的,因此对精度不会造成影响的。
float精度范围是:2^23一共7位,因此最多能表示7位,但是能保证的是6位。
double的精度范围是2^52一共16位,同理最多能表示16位,但是能保证的是15位。
02内存对齐算法
由此可见,我们只要对数据补齐对齐所需最少数据,然后将补齐位置0就可以实现对齐计算。
(1)(align-1),表示对齐所需的对齐位,如:2字节对齐为1,4字节为11,8字节为111,16字节为1111...
(2)(x+(align-1)),表示x补齐对齐所需数据
(3)&~(align-1),表示去除由于补齐造成的多余数据
(4) (x+(align-1))&~(align-1),表示对齐后的数据
举个例子:如8字节对齐。起始地始是6
6 + (8 - 1)=0000 0110 + 0000 0111 = 0000 1101
0000 1101 & ~(0000 0111) = 0000 1000 //去除由于补齐造成的多余数据
03一个低级Illegal instruction错误的定位--忽略编译期警告就得加倍偿还
INFO_LOG("id[%s] ...", packet->strid, ...);
当packet->strid为string类型,不是char*类型时
会报编译警告
ProcessHeartbeat.cpp:408: warning: cannot pass objects of non-POD type âstruct std::stringâ through â...â; call will abort at runtime
但不会报error,但会在运行时崩溃,Program terminated with signal 4,Illegal instruction.

04NAT的特殊处理
NAT技术的原理并不复杂,如图1所示,三个带有内部地址的数据报文到达NAT设备,其中报文1和报文2来自同一个内部地址但有不同的源端口号,报文1和报文3来自不同的内部地址但具有相同的源端口号。通过NAT映射,三个数据报的源IP地址都被转换到同一个外部地址,但每个数据报都被赋予了不同的源端口号,因而仍保留了报文之间的区别。当各报文的回应报文到达时,NAT设备仍能够根据回应报文的目的IP地址和目的端口号来区别该报文应转发到的内部主机。
NAT设备通过建立五元组(源地址、源端口号、协议类型、目的地址、目的端口号)表项为依据进行地址分配和报文过滤。即,对于来自相同源地址和源端口号的报文,若其目的地址和目的端口号不同,通过映射后,相同的源地址和源端口号将被转换为不同的外部地址和端口号,并且NAT设备只允许这些目的地址对应的外部网络的主机才可以通过该转换后的地址和端口来访问这些内部网络的主机。
05如何加快C++代码的编译速度
C++代码一直以其运行时的高性能高调面对世人, 但是说起编译速度,却只有低调的份了。比如我现在工作的源代码,哪怕使用Incredibuild调动近百台机子,一个完整的build也需要四个小时,恐怖!!!虽然平时开发一般不需要在本地做完整的build,但编译几个相关的工程就够你等上好一段时间的了(老外管这个叫monkey around,相当形象)。想想若干年在一台单核2.8GHZ上工作时的场景 - 面前放本书,一点build按钮,就低头读一会书~~~往事不堪回首。06C++中复制构造函数可以调取其他对象中的私有变量
封装是编译期的概念,是针对类型而非对象的,在类的成员函数中可以访问同类型实例对象的私有成员变量.
07为什么多线程读写 shared_ptr 要加锁?
(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的线程安全级别和内建类型、标准库容器、std::string 一样,即:
• 一个 shared_ptr 对象实体可被多个线程同时读取(文档例1);
• 两个 shared_ptr 对象实体可以被两个线程同时写入(例2),“析构”算写操作;
• 如果要从多个线程读写同一个 shared_ptr 对象,那么需要加锁(例3~5)。
请注意,以上是 shared_ptr 对象本身的线程安全级别,不是它管理的对象的线程安全级别。
后文(p.18)则介绍如何高效地加锁解锁。本文则具体分析一下为什么“因为 shared_ptr 有两个数据成员,读写操作不能原子化”使得多线程读写同一个 shared_ptr 对象需要加锁。这个在我看来显而易见的结论似乎也有人抱有疑问,那将导致灾难性的后果,值得我写这篇文章。本文以 boost::shared_ptr 为例,与 std::shared_ptr 可能略有区别。
shared_ptr 的数据结构
shared_ptr 是引用计数型(reference counting)智能指针,几乎所有的实现都采用在堆(heap)上放个计数值(count)的办法(除此之外理论上还有用循环链表的办法,不过没有实例)。具体来说,shared_ptr<Foo> 包含两个成员,一个是指向 Foo 的指针 ptr,另一个是 ref_count 指针(其类型不一定是原始指针,有可能是 class 类型,但不影响这里的讨论),指向堆上的 ref_count 对象。ref_count 对象有多个成员,具体的数据结构如图 1 所示,其中 deleter 和 allocator 是可选的。
08字符串流 istringstream 和 ostringstream 的用法
• istringstream,由 istream 派生而来,提供读 string 的功能。
• ostringstream,由 ostream 派生而来,提供写 string 的功能。
• stringstream,由 iostream 派生而来,提供读写 string 的功能。
ostringstream format_message;
format_message << "val1: " << val1 ;
cout << "val1: " << val1 ;
ostringstream 和 cout 用法是一致的;

10程序员的核心能力 - 引擎式思维
把你代码中普适的、可重用的部分与具体业务逻辑分离的思想,就是引擎式思维。在游戏中我们叫它引擎(Engine),在应用开发中我们叫它框架(Framework),在基础服务里我们又叫它架构(Architecture),但它们背后的思想是相同的。
有些新手可能会觉得引擎、框架这些东西都是大牛开发的,我们只要会用就好了。但其实事情不论大小,只要有套路可寻,都可以用引擎式思维去解决。在你日常要解决的问题中,粗看可能各不相同,但这时你若退后一步,从一个更高地视角去发现问题之间的共同点,把解决方案中通用的部分从具体的问题中抽离出来,这时你就有了自己的框架。这是程序员的一种核心能力,它不会因为技术的日新月异而过时,但你也不可能一跃而蹴,它会随着你技术能力的成熟而逐渐精进。就如同武侠小说里的内功,难以速成,但却比学习任何具体的招式都更重要。
11一致性哈希算法的理解与实践
在维基百科中,是这么定义的一致哈希
是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n个关键字重新映射,其中K是关键字的数量, n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。
12Sigkill带来的挑战
这个排查问题的过程是我更关注的,接触了好多新的东西,OOM killer 机制,ulimit各种参数及后果,强大的systemtap内核调试工具,可以跟踪很多内核事件以及一次完整的经验,以后希望能够更快的定位问题,更有力的思维过程,最终写好自己的程序,为他们的运行负责。详细关键的日志真是不可缺少。
点击排行

站长推荐

猜你喜欢
站点信息
- 建站时间:2016-04-01
- 文章统计:728条
- 文章评论:82条
- QQ群二维码:扫描二维码,互相交流
