muduo3学习笔记——Timestamp.{h,cc}

首先代码中的一些要点:
(1)Timestamp类继承自boost::less_than_comparable 模板类
只要实现 <,即可自动实现>,<=,>=
(2)使用到了BOOST_STATIC_ASSERT,编译时断言;
(3)gmtime和gmtime_r函数
(4)函数参数采用值传递
(5)使用PRId64
(6)对象语义和值语义
可以看谱哥笔记,然后就开始数据结构啦


muduo3学习笔记——Timestamp.{h,cc}_第1张图片可以看到Timestamp继承自多个基类:其中muduo::copyable这是一个空基类,起到一个标识作用,用来标识凡是继承自这个类的都是值类型,都是可拷贝的;

值语义:可以拷贝,且拷贝之后,与原对象脱离关系
对象语义:要么是不能拷贝的,要么可以拷贝,但拷贝之后与原对象仍然存在一定的关系,如共享底层资源(要实现自己的拷贝构造函数)
muduo库大部分都是对象语义,不能拷贝的,只有少部分是值语义

继承的另一个类less_than_comparable,要求我们实现<,可自动实现>,<=,>=这些比较运算符,代码中也就实现了<和==
muduo3学习笔记——Timestamp.{h,cc}_第2张图片
其余比较符就自动实现了

BOOST_STATIC_ASSERT 宏的作用

assert是运行时断言,而BOOST_STATIC_ASSERT是编译时断言,即在编译的时候就能检查出这个条件是否满足,下面例子理解:

#include 

class Timestamp
{
private: 
    int64_t microSecondsSinceEpoch_;
};

// 编译时断言通过
// BOOST_STATIC_ASSERT(sizeof(Timestamp) == sizeof(int64_t));

// 编译时断言失败
BOOST_STATIC_ASSERT(sizeof(int) == sizeof(short));

int main(void)
{
    return 0;
}

gmtime和gmtime_r函数

struct tm *gmtime(const time_t *timep);
struct tm *gmtime_r(const time_t *timep, struct tm *result);

gmtime(线程不安全的)是把日期和时间转换为格林威治(GMT)时间的函数。将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm返回。使用gmtime后要立即处理结果,否则返回的指针指向的内容可能会被覆盖。
一个好的方法是使用gmtime_r(线程安全的),gmtime_r()函数功能与此相同,但是它可以将数据存储到用户提供的结构体中,由于使用了用户分配的内存,是不会出错的。

函数参数采用值传递

举例

inline Timestamp addTime(Timestamp timestamp, double seconds)
{
  int64_t delta = static_cast<int64_t>(seconds * Timestamp::kMicroSecondsPerSecond);
  return Timestamp(timestamp.microSecondsSinceEpoch() + delta);
}

类对象作为参数不一定能够采用引用传递更高效,这里采用值传递,因为Timestamp类只包含一个类型为int64_t的数据成员microSecondsSinceEpoch_,所以可以把Timestamp对象看作一个84位的整数。参数传递过程中,会把参数传递到一个8字节的寄存器中而不是传递到堆栈中(在对应的64位平台),效率会更高

使用PRId64

int64_t用来标识64位整数,在32位系统中是long long int, 在64位系统中是long int,所以打印int64_t的格式化方法是:

printf(%ld”, value);  // 64bit OS
printf("%lld", value); // 32bit OS

那这种方法是不可移植的

为了跨平台使用PRId64:


// C++使用PRID64,需要两步:
// 包含头文件:
// 定义宏:__STDC_FORMAT_MACROS,可以通过编译时加-D__STDC_FORMAT_MACROS,或者在包含文件之前定义这个宏。
#define __STDC_FORMAT_MACROS
#include 
#undef __STDC_FORMAT_MACROS 

printf("%" PRId64 "\n", value);  

对象语义和值语义

值语义: 值语义是指对象的拷贝与原对象无关,拷贝之后就与原对象脱离关系,彼此独立互不影响(深拷贝), C++中的内置类型都是值语义,比如说int,值语义的一个好处是生命期管理很简单
对象语义: 对象语义指的是面向对象意义下的对象
对象拷贝要么是禁止的noncopyable,要么一个对象被系统标准的复制方式复制后,与被复制的对象之间依然共享资源,对任何一个的改变都将改变另一个(浅拷贝),比如Thread是对象语义,拷贝Thread是无意义的,也是被禁止的,因为Thread代表线程,拷贝一个Thread对象并不能让系统增加一个一模一样的线程

对象语义对象生命期不容易控制,一般通过智能指针来解决。智能指针实际上是将对象语义转化为值语义,利用局部对象(智能指针)的确定性析构,智能指针包括auto_ptr, shared_ptr, weak_ptr, scoped_ptr。


没看出点啥……没有啥感jio

你可能感兴趣的:(muduo源码)