TimeStamp(UTC时间戳)
- 前置
- copyable和noncopyable
- TimeStamp
- now()
此博客跟着b站上的:大并发服务器开发(实战)学习做的笔记
前置
值语义、对象语义:
- 值语义:所谓值语义是一个对象被系统标准的复制方式复制后,与被复制的对象之间毫无关系,可以彼此独立改变互不影响
- 对象语义:也叫指针语义,引用语义等,通常是指一个对象被系统标准的复制方式复制后,与被复制的对象之间依然共享底层资源,对任何一个的改变都将改变另一个
编译时断言和运行时断言:
- 静态断言:在编译期对表达式进行判断:
static_assert(常量表达式,"提示字符串");
- 动态断言:运行时断言
关于宏__STDC_FORMAT_MACROS:
- 需要定义宏__STDC_FORMAT_MACROS后才能包含inttypes.h
copyable和noncopyable
在base文件夹下有两个文件分别定义了两个类(空基类,标识类,值类型)copyable和noncopyable
copyable (派生类都是值语义)#ifndef MUDUO_BASE_COPYABLE_H #define MUDUO_BASE_COPYABLE_H namespace muduo { /// A tag class emphasises the objects are copyable. /// The empty base class optimization applies. /// Any derived class of copyable should be a value type. class copyable { protected:copyable() = default;~copyable() = default; }; } // namespace muduo #endif // MUDUO_BASE_COPYABLE_H
noncopyable
#ifndef MUDUO_BASE_NONCOPYABLE_H #define MUDUO_BASE_NONCOPYABLE_H namespace muduo { class noncopyable { public:noncopyable(const noncopyable&) = delete;void operator=(const noncopyable&) = delete; protected:noncopyable() = default;~noncopyable() = default; }; } // namespace muduo #endif // MUDUO_BASE_NONCOPYABLE_H
TimeStamp
TimeStamp类是copyable,boost::equality_comparable,boost::less_than_comparable的派生类
class Timestamp : public muduo::copyable,public boost::boost::equality_comparable<Timestamp>,public boost::less_than_comparable<Timestamp>
muduo::copyable :
- 值语义,可以拷贝
boost::equality_comparable :(实现在boost库中operator.hpp中)
- 派生类TimeStamp提供
inline bool operator==(Timestamp lhs, Timestamp rhs)
,
将自动生成
inline bool operator!=(Timestamp lhs, Timestamp rhs)
boost::less_than_comparable :(实现在boost库中operator.hpp中)
- 派生类TimeStamp提供:
inline bool operator<(Timestamp lhs, Timestamp rhs)
将自动生成
inline bool operator>(Timestamp lhs, Timestamp rhs)
inline bool operator>=(Timestamp lhs, Timestamp rhs)
inline bool operator<=(Timestamp lhs, Timestamp rhs)
类图:
- static const int kMicroSecondsPerSecond = 1000 * 1000 :表示每秒所对应的微秒数一百万
- int64_t microSecondsSinceEpoch_ :时间戳微秒数,到1970-01-01 00:00:00 UTC的微秒数
- 构造可以使用时间戳微秒数来构造
- swap交换函数
now()
Timestamp Timestamp::now() {struct timeval tv;//定义一个时间结构体gettimeofday(&tv, NULL);//c库函数(系统函数也有),结构体tv接收int64_t seconds = tv.tv_sec;//获取秒return Timestamp(seconds * kMicroSecondsPerSecond + tv.tv_usec);//秒*1000000+微秒,返回时间戳 }
函数较简单,略