muduo网络库学习笔记(2)—Timestamp类

1. 时间戳(Timestamp)类图

在这里插入图片描述
一个常量kMicroSecondsPerSecond,表示每秒所对应的微秒数,成员变量microSecondsSinceEpoch_表示到1970-01-01 00:00:00 UTC的微秒数

2. 关于使用时间的API

先看三个时间结构体:
struct timeval
{
	long tv_sec;//秒 64位 8字节
	long tv_usec;//微秒
};
struct tm 
{  
int tm_sec;		 // 秒–取值区间为[0,59]   
int tm_min; 		 /* 分 - 取值区间为[0,59] */   
int tm_hour; 	         /* 时 - 取值区间为[0,23] */   
int tm_mday;		 /* 一个月中的日期 - 取值区间为[1,31] */  
int tm_mon;		 /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */ 
int tm_year; 	         /* 年份,其值从1900开始 */  
int tm_wday; 	         /* 星期–取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */  
int tm_yday; 	         /* 从每年的1月1日开始的天数–取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */  
int tm_isdst; 	         /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/  
long int tm_gmtoff;	 /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/   
const char *tm_zone;     /*当前时区的名字(与环境变量TZ有关)*/  
}; 
struct  timezone{        //时区信息
        int tz_minuteswest;/*和greenwich时间差*/
        int tz_dsttime; //DST修正方式
}

几个时间函数:

time_t time(time_t timer );
//timer为传出参数,和返回值一样,返回从1970年到现在的秒数(时间戳)
int gettimeofday(struct timeval *tv,struct timezone *tz)
//都是传出参数,返回秒、微妙、时区信息。不关心时区信息可以传NULL

以上两个API都是获取跟格林威治时间的时间差,time()只能返回到秒级,gettimeofday()可以返回微妙级

struct tm* gmtime(const time_t *timer);//线程不安全的
//timer为传入参数,将时间戳timer转换为世界标准时(格林威治时间) 比北京晚8个小时
struct tm* gmtime_r(const time_t *timer, struct tm* tm_timer);//线程安全的

在gmtime_r中,tm_timer为传出参数,将数据保存在用户提供的结构体中,由于使用的是用户分配的内存,所以是安全的。

将struct tm转换为char*

#include <time.h>
size_t strftime(char *s,size_t max,const char *format,const struct tm *tm);

例如:

char timebuf[32];
  struct tm tm;
  time_t *now = time(NULL);
  gmtime_r(now, &tm); // FIXME: localtime_r ?
  strftime(timebuf, sizeof timebuf, ".%Y%m%d-%H%M%S.", &tm);

3. 函数参数使用值传递

例如:

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对象看作是一个64位(8字节)的整数。参数传递的过程中,会把参数传递到一个8字节的寄存器中而不是传递到堆栈当中(在对应的64位平台),它的效率会更高。

4. 对象语义和值语义

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

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

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐