muduo網路庫學習筆記(1):Timestamp類
時間戳一般用來唯一地標識某一刻的時間,通常是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總毫秒數。
muduo網路庫對時間戳Timestamp類也進行了封裝。
Timestamp類類圖:
由類圖可知,Timestamp類的引數有一個常量kMicroSecondsPerSecond表示每秒所對應的微秒數,成員變數microSecondsSinceEpoch_表示到1970-01-01 00:00:00 UTC的微秒數。成員函式包括swap()交換操作,toString()、toFormattedString()將時間轉換為string型別或指定格式,valid()判斷Timestamp是否有效,invalid()返回一個無效的Timestamp,now()返回當前時間的Timestamp,secondsSinceEpoch()/microSecondsSinceEpoch()返回到1970-01-01 00:00:00 UTC的秒數/微秒數。
程式碼中的一些要點如下:
(1)Timestamp類繼承自boost::less_than_comparable <T>模板類
只要實現 <,即可自動實現>,<=,>=
(2)使用到了BOOST_STATIC_ASSERT,編譯時斷言
我們一般使用的assert是執行時斷言,用一個小例子來理解BOOST_STATIC_ASSERT:
#include <boost/static_assert.hpp>
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;
}
編譯上述例子,在編譯時就會報錯
(3)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()函式功能與此相同,但是它可以將資料儲存到使用者提供的結構體中,由於使用了使用者分配的記憶體,是不會出錯的。
節選muduo原始碼中的使用示例:
string Timestamp::toFormattedString() const
{
char buf[32] = {0};
time_t seconds = static_cast<time_t>(microSecondsSinceEpoch_ / kMicroSecondsPerSecond); // 秒數
int microseconds = static_cast<int>(microSecondsSinceEpoch_ % kMicroSecondsPerSecond);
struct tm tm_time; // 微秒數
// 把time_t結構中的資訊轉換成真實世界所使用的時間日期,儲存在tm_time結構中
gmtime_r(&seconds, &tm_time);
// 格式化輸出時間戳
snprintf(buf, sizeof(buf), "%4d%02d%02d %02d:%02d:%02d.%06d",
tm_time.tm_year + 1900, tm_time.tm_mon + 1, tm_time.tm_mday,
tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec,
microseconds);
return buf;
}
(4)函式引數採用值傳遞
例如:
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位平臺),它的效率會更高。
(5)使用PRId64
int64_t用來表示64位整數,在32位系統中是long long int,在64位系統中是long int,所以列印int64_t的格式化方法是:
printf(“%ld”, value); // 64bit OS
printf("%lld", value); // 32bit OS
這種做法是不可移植的。
跨平臺的做法:
// C++使用PRID64,需要兩步:
// 包含標頭檔案:<inttypes.h>
// 定義巨集:__STDC_FORMAT_MACROS,可以通過編譯時加-D__STDC_FORMAT_MACROS,或者在包含檔案之前定義這個巨集。
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#undef __STDC_FORMAT_MACROS
printf("%" PRId64 "\n", value);
(6)物件語義和值語義
值語義:值語義是指物件的拷貝與原物件無關,拷貝之後就與原物件脫離關係,彼此獨立互不影響(深拷貝)。C++中的內建型別都是值語義,比如說int。值語義的一個巨大好處是生命期管理很簡單。
物件語義:物件語義指的是物件導向意義下的物件。
物件拷貝要麼是禁止的(Noncopyable) ,要麼一個物件被系統標準的複製方式複製後,與被複制的物件之間依然共享底層資源,對任何一個的改變都將改變另一個(淺拷貝)。比如,Thread 是物件語義,拷貝 Thread 是無意義的,也是被禁止的:因為 Thread 代表執行緒,拷貝一個Thread物件並不能讓系統增加一個一模一樣的執行緒。
物件語義物件生命期不容易控制,一般通過智慧指標來解決。智慧指標實際上是將物件語義轉化為值語義,利用區域性物件(智慧指標)的確定性析構,智慧指標包括auto_ptr, shared_ptr, weak_ptr, scoped_ptr。
相關文章
- muduo網路庫Timestamp類
- muduo網路庫學習筆記(3):Thread類筆記thread
- muduo網路庫學習筆記(12):TcpServer和TcpConnection類筆記TCPServer
- muduo網路庫學習筆記(8):高效日誌類的封裝筆記封裝
- muduo網路庫學習筆記(2):原子性操作筆記
- muduo網路庫學習之Timestamp類、AtomicIntegerT 類封裝中的知識點封裝
- muduo網路庫學習筆記(6):單例類(執行緒安全的)筆記單例執行緒
- muduo網路庫學習筆記(14):chargen服務示例筆記
- muduo網路庫學習之muduo_http 庫涉及到的類HTTP
- muduo網路庫學習筆記(11):有用的runInLoop()函式筆記OOP函式
- muduo網路庫學習之muduo_inspect 庫涉及到的類
- muduo網路庫學習筆記(13):TcpConnection生命期的管理筆記TCP
- muduo網路庫學習筆記(10):定時器的實現筆記定時器
- muduo網路庫學習筆記(7):執行緒特定資料筆記執行緒
- muduo網路庫學習筆記(9):Reactor模式的關鍵結構筆記React模式
- muduo網路庫學習筆記(4):互斥量和條件變數筆記變數
- muduo網路庫學習筆記(5):執行緒池的實現筆記執行緒
- muduo網路庫學習之EventLoop(四):EventLoopThread 類、EventLoopThreadPool 類OOPthread
- muduo網路庫Exception異常類Exception
- muduo網路庫學習筆記(15):關於使用stdio和iostream的討論筆記iOS
- muduo網路庫學習之ThreadLocal 類、ThreadLocalSingleton類封裝知識點thread封裝
- muduo網路庫學習之EventLoop(七):TcpClient、ConnectorOOPTCPclient
- muduo網路庫學習之EventLoop(一):事件迴圈類圖簡介和muduo 定時器TimeQueueOOP事件定時器
- muduo網路庫AtomicIntegerT原子整數類
- muduo網路庫學習之MutexLock類、MutexLockGuard類、Condition類、CountDownLatch類封裝中的知識點MutexCountDownLatch封裝
- muduo網路庫學習之BlockinngQueue類、ThreadPool 類、Singleton類封裝中的知識點BloCthread封裝
- 【OCP學習筆記】配置網路環境 -- 1筆記
- muduo網路庫學習之Logger類、LogStream類、LogFile類封裝中的知識點封裝
- 【學習筆記】網路流筆記
- [網路]NIO學習筆記筆記
- 網路流學習筆記筆記
- muduo網路庫使用心得
- muduo網路庫學習之EventLoop(六):TcpConnection::send()、shutdown()、handleRead()、handleWrite()OOPTCP
- muduo網路庫編譯安裝編譯
- muduo網路庫學習之Exception類、Thread 類封裝中的知識點(重點講pthread_atfork())Exceptionthread封裝
- 學習筆記1筆記
- 學習筆記-1筆記
- 學習筆記16:殘差網路筆記