建设商业门户网站的重要,前端学什么,wordpress 设置网站目录,视频网站数据库设计std::move()
C11的标准库 提供了一个非常有用的函数 std::move()#xff0c;std::move() 函数将一个左值强制转化为右值引用#xff0c;以用于移动语义。
就是说 std::move(str); 之后原来的值因为变成了右值失效了 但是这样赋值可以避免出现拷贝
#include iostream11的标准库 提供了一个非常有用的函数 std::move()std::move() 函数将一个左值强制转化为右值引用以用于移动语义。
就是说 std::move(str); 之后原来的值因为变成了右值失效了 但是这样赋值可以避免出现拷贝
#include iostream
#include string
#include vector
using namespace std;int main()
{string str hello;cout before str: str endl;vectorstring vstr;vstr.emplace_back(std::move(str));cout after str: str endl;return 0;
}str 就没有了因为被转移语义了 #include iostream
#include functional
#include utility
#include tinyNetWorkLib.h
class People{using actionEvent std::functionvoid();public:People():value(2){}People(int v):value(v){}void setCryEvent(actionEvent func){ cry std::move(func); }void setSimleEvent(actionEvent func){ smile std::move(func);}void handleEvent(Timestamp receiverTime){if(value 0){smile(); coutreceiverTime.toFormattedString()endl;}else{cry();coutreceiverTime.toFormattedString()endl;}}
private:actionEvent cry;actionEvent smile;int value;
};
int main()
{std::functionvoid() func []{std:: couthappystd::endl; };std::functionvoid() func2 []{std::coutcrystd::endl;};People peo;peo.setCryEvent(func2);peo.setSimleEvent(func);peo.handleEvent(Timestamp ::now());// std::cout Hello world std::endl;return 0;
}
执行结果
happy
2023/08/27 20:49:59
这里函数指针还能用,因为这里转移语义的对象是参数
给出依赖文件的代码Timestamp 复制下来用就好
记得给个#ifndef这里自己
#include functional
#include set
#include sys/time.h
#include sys/eventfd.h
#include fcntl.h
#include unistd.h
#include mutex
#includeunordered_map
using namespace std;
class Timestamp
{
public:Timestamp(): microSecondsSinceEpoch_(0){}explicit Timestamp(int64_t microSecondsSinceEpoch): microSecondsSinceEpoch_(microSecondsSinceEpoch){}// 获取当前时间戳static Timestamp now();//用std::string形式返回,格式[millisec].[microsec]std::string toString() const;//格式, %4d年%02d月%02d日 星期%d %02d:%02d:%02d.%06d,时分秒.微秒std::string toFormattedString(bool showMicroseconds false) const;//返回当前时间戳的微妙int64_t microSecondsSinceEpoch() const { return microSecondsSinceEpoch_; }//返回当前时间戳的秒数time_t secondsSinceEpoch() const{ return static_casttime_t(microSecondsSinceEpoch_ / kMicroSecondsPerSecond); }// 失效的时间戳返回一个值为0的Timestampstatic Timestamp invalid(){return Timestamp();}// 1秒1000*1000微妙static const int kMicroSecondsPerSecond 1000 * 1000;private:// 表示时间戳的微秒数(自epoch开始经历的微妙数)int64_t microSecondsSinceEpoch_;
};/*** 定时器需要比较时间戳因此需要重载运算符*/
inline bool operator(Timestamp lhs, Timestamp rhs)
{return lhs.microSecondsSinceEpoch() rhs.microSecondsSinceEpoch();
}inline bool operator(Timestamp lhs, Timestamp rhs)
{return lhs.microSecondsSinceEpoch() rhs.microSecondsSinceEpoch();
}// 如果是重复定时任务就会对此时间戳进行增加。
inline Timestamp addTime(Timestamp timestamp, double seconds)
{// 将延时的秒数转换为微妙int64_t delta static_castint64_t(seconds * Timestamp::kMicroSecondsPerSecond);// 返回新增时后的时间戳return Timestamp(timestamp.microSecondsSinceEpoch() delta);
}Timestamp Timestamp::now()
{struct timeval tv;// 获取微妙和秒// 在x86-64平台gettimeofday()已不是系统调用,不会陷入内核, 多次调用不会有性能损失.gettimeofday(tv, NULL);int64_t seconds tv.tv_sec;// 转换为微妙return Timestamp(seconds * kMicroSecondsPerSecond tv.tv_usec);
}// 2022/08/26 16:29:10
// 20220826 16:29:10.773804
std::string Timestamp::toFormattedString(bool showMicroseconds) const
{char buf[64] {0};time_t seconds static_casttime_t(microSecondsSinceEpoch_ / kMicroSecondsPerSecond);// 使用localtime函数将秒数格式化成日历时间tm *tm_time localtime(seconds);if (showMicroseconds){int microseconds static_castint(microSecondsSinceEpoch_ % kMicroSecondsPerSecond);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);}else{snprintf(buf, sizeof(buf), %4d/%02d/%02d %02d:%02d:%02d,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);}return buf;
}
最后我们给出要给第一个版本的channel
一个文件描述符,发生读事件 写时间 关闭事件 错误事 文件描述符就是一个整形变量 int revents 表示这个文件描述符的心情(状态) 通过位运算表示 和EPOLLINT OUT HUB 先不管
#include functional
#include tinyNetWorkLib.h
#include sys/epoll.hclass Channel{using EventCallback std::functionvoid();using ReadEventCallback std::functionvoid(Timestamp);
public: Channel(int fd):fd_(fd){};void setReadCallback(ReadEventCallback cb) { readCallback_ std::move(cb); }void setWriteCallback(EventCallback cb) { writeCallback_ std::move(cb); }void setCloseCallback(EventCallback cb) { closeCallback_ std::move(cb); }void setErrorCallback(EventCallback cb) { errorCallback_ std::move(cb); } void set_revents(int revt){ revents revt; }void handleWithGuard(Timestamp receiverTime){if(revents EPOLLHUP !(revents EPOLLIN)){if(closeCallback_){closeCallback_();}}if(revents EPOLLERR){if(errorCallback_){errorCallback_();} }if(revents (EPOLLIN|EPOLLPRI)){if(readCallback_){readCallback_(receiverTime);}}if(revents EPOLLOUT){if(writeCallback_){writeCallback_();}}}private:ReadEventCallback readCallback_;EventCallback writeCallback_;EventCallback closeCallback_;EventCallback errorCallback_;const int fd_;int revents;};
这个和我们People类设计几乎一样除了设计了一点系统知识
#include iostream
#include functional
#include utility
#include tinyNetWorkLib.h
#include Channel.h
class People{using actionEvent std::functionvoid();public:People():value(2){}People(int v):value(v){}void setCryEvent(actionEvent func){ cry std::move(func); }void setSimleEvent(actionEvent func){ smile std::move(func);}void handleEvent(Timestamp receiverTime){if(value 0){smile(); coutreceiverTime.toFormattedString()endl;}else{cry();coutreceiverTime.toFormattedString()endl;}}int set_value(int v){value v;}
private:actionEvent cry;actionEvent smile;int value;
};
int main()
{std::functionvoid() func []{std:: couthappystd::endl; };std::functionvoid() func2 []{std::coutcrystd::endl;};// People peo;// peo.setCryEvent(func2);// peo.setSimleEvent(func);// peo.handleEvent(Timestamp ::now());// std::cout Hello world std::endl;// func();Channel chanel(1);chanel.set_revents(EPOLLOUT);chanel.setWriteCallback(func);chanel.handleWithGuard(Timestamp::now());return 0;
}
执行结果
happy 文章转载自: http://www.morning.nqmdc.cn.gov.cn.nqmdc.cn http://www.morning.wkmrl.cn.gov.cn.wkmrl.cn http://www.morning.yrgb.cn.gov.cn.yrgb.cn http://www.morning.yfwygl.cn.gov.cn.yfwygl.cn http://www.morning.hsgxj.cn.gov.cn.hsgxj.cn http://www.morning.zstry.cn.gov.cn.zstry.cn http://www.morning.ychrn.cn.gov.cn.ychrn.cn http://www.morning.gprzp.cn.gov.cn.gprzp.cn http://www.morning.lztrt.cn.gov.cn.lztrt.cn http://www.morning.kwxr.cn.gov.cn.kwxr.cn http://www.morning.qtzwh.cn.gov.cn.qtzwh.cn http://www.morning.ftgwj.cn.gov.cn.ftgwj.cn http://www.morning.qiyelm.com.gov.cn.qiyelm.com http://www.morning.zbqsg.cn.gov.cn.zbqsg.cn http://www.morning.cwrnr.cn.gov.cn.cwrnr.cn http://www.morning.tzlfc.cn.gov.cn.tzlfc.cn http://www.morning.cbnjt.cn.gov.cn.cbnjt.cn http://www.morning.rjrh.cn.gov.cn.rjrh.cn http://www.morning.hdrsr.cn.gov.cn.hdrsr.cn http://www.morning.nbiotank.com.gov.cn.nbiotank.com http://www.morning.trfrl.cn.gov.cn.trfrl.cn http://www.morning.kzslk.cn.gov.cn.kzslk.cn http://www.morning.skfkx.cn.gov.cn.skfkx.cn http://www.morning.ttxnj.cn.gov.cn.ttxnj.cn http://www.morning.jrqw.cn.gov.cn.jrqw.cn http://www.morning.nswcw.cn.gov.cn.nswcw.cn http://www.morning.ljyqn.cn.gov.cn.ljyqn.cn http://www.morning.rfxw.cn.gov.cn.rfxw.cn http://www.morning.yllym.cn.gov.cn.yllym.cn http://www.morning.jfbbq.cn.gov.cn.jfbbq.cn http://www.morning.gzzxlp.com.gov.cn.gzzxlp.com http://www.morning.lwsct.cn.gov.cn.lwsct.cn http://www.morning.swsrb.cn.gov.cn.swsrb.cn http://www.morning.bfrsr.cn.gov.cn.bfrsr.cn http://www.morning.fblkr.cn.gov.cn.fblkr.cn http://www.morning.rmqlf.cn.gov.cn.rmqlf.cn http://www.morning.dhnqt.cn.gov.cn.dhnqt.cn http://www.morning.mmhaoma.com.gov.cn.mmhaoma.com http://www.morning.wnqbf.cn.gov.cn.wnqbf.cn http://www.morning.wgrm.cn.gov.cn.wgrm.cn http://www.morning.rkqkb.cn.gov.cn.rkqkb.cn http://www.morning.xflwq.cn.gov.cn.xflwq.cn http://www.morning.ylpwc.cn.gov.cn.ylpwc.cn http://www.morning.mywmb.cn.gov.cn.mywmb.cn http://www.morning.tralution.cn.gov.cn.tralution.cn http://www.morning.nmtyx.cn.gov.cn.nmtyx.cn http://www.morning.xfyjn.cn.gov.cn.xfyjn.cn http://www.morning.lbssg.cn.gov.cn.lbssg.cn http://www.morning.lrnfn.cn.gov.cn.lrnfn.cn http://www.morning.bpptt.cn.gov.cn.bpptt.cn http://www.morning.rczrq.cn.gov.cn.rczrq.cn http://www.morning.rjnx.cn.gov.cn.rjnx.cn http://www.morning.xqkjp.cn.gov.cn.xqkjp.cn http://www.morning.ylpwc.cn.gov.cn.ylpwc.cn http://www.morning.nlgyq.cn.gov.cn.nlgyq.cn http://www.morning.rpjr.cn.gov.cn.rpjr.cn http://www.morning.ntqjh.cn.gov.cn.ntqjh.cn http://www.morning.dmzfz.cn.gov.cn.dmzfz.cn http://www.morning.sjwzl.cn.gov.cn.sjwzl.cn http://www.morning.jbhhj.cn.gov.cn.jbhhj.cn http://www.morning.sjqpm.cn.gov.cn.sjqpm.cn http://www.morning.rkdw.cn.gov.cn.rkdw.cn http://www.morning.lwgsk.cn.gov.cn.lwgsk.cn http://www.morning.xhlpn.cn.gov.cn.xhlpn.cn http://www.morning.rzrbw.cn.gov.cn.rzrbw.cn http://www.morning.yjfmj.cn.gov.cn.yjfmj.cn http://www.morning.wkmrl.cn.gov.cn.wkmrl.cn http://www.morning.wskn.cn.gov.cn.wskn.cn http://www.morning.tbqdm.cn.gov.cn.tbqdm.cn http://www.morning.dpsgq.cn.gov.cn.dpsgq.cn http://www.morning.tbqdm.cn.gov.cn.tbqdm.cn http://www.morning.lkhgq.cn.gov.cn.lkhgq.cn http://www.morning.rswfj.cn.gov.cn.rswfj.cn http://www.morning.kxsnp.cn.gov.cn.kxsnp.cn http://www.morning.qgxnw.cn.gov.cn.qgxnw.cn http://www.morning.zzqgc.cn.gov.cn.zzqgc.cn http://www.morning.wblpn.cn.gov.cn.wblpn.cn http://www.morning.swsrb.cn.gov.cn.swsrb.cn http://www.morning.cnfxr.cn.gov.cn.cnfxr.cn http://www.morning.bqqzg.cn.gov.cn.bqqzg.cn