muduo网络库学习笔记(2)—Timestamp类及时间相关的函数
muduo网络库学习笔记(1)—Timestamp类1. 时间戳(Timestamp)类图一个常量kMicroSecondsPerSecond,表示每秒所对应的微秒数,成员变量microSecondsSinceEpoch_表示到1970-01-01 00:00:00 UTC的微秒数2. 关于使用时间的API先看三个时间结构体:struct timeval{long tv_sec;//秒 64位 8
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。
更多推荐
所有评论(0)