const

muduo网络库学习——日志系统

允我心安 提交于 2020-03-03 00:51:41
日志的使用方式: LOG_INFO << "AAA"; LOG_INFO是一个宏,展开后为: muduo::Logger(__FILE__, __LINE__).stream() << "AAA"; 构造了一个匿名对象Logger,在这个对象构造的时候其实已经写入了文件名和行号。 匿名对象调用.stream()函数拿到一个LogStream对象,由这个LogStream对象重载<<将“AAA”写入LogStream的数据成员FixBuffer对象的data_缓冲区内。 匿名对象在这条语句执行完毕以后会被销毁,因此会调用~muduo::Logger()函数将日志消息输出至目的地(标准输出或者磁盘的日志文件); 日志的流程: Logger——Impl——LogStream——operator<<——LogStream的FixBuffer内——g_output——g_flush 高性能日志(异步日志)所在: 由于磁盘IO是移动磁头的方式来记录文件的,其速度与CPU运行速度并不在一个数量级上。因此业务线程中应该避免进行磁盘IO以防止业务得不到及时的处理。 在多线程程序中,业务线程应该专注与其业务逻辑的运算,用另外一个独立的线程来将日志消息写入磁盘。 在muduo的日志系统中,分为前端和后端。前端是业务线程产生一条条的日志消息。后端是日志线程,将日志消息写入文件。 业务线程有多个

函数指针

跟風遠走 提交于 2020-03-03 00:21:43
函数指针 函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。例如: //比较两个string对象的长度 bool lengthCompare(const string&,const string&); 该函数的类型是bool(const string&,const string&).要想声明一个可以指向该函数的指针,只需要用指针替换函数名即可: //pf 指向一个函数,该函数的参数是两个const string的引用,返回值是bool类型 bool (*pf)(const string &,const string &); //未初始化 从我们声明的名字开始观察,pf前面有个*,因此pf是指针;右侧是形参列表,表示pf指向的是函数;再观察左侧,发现函数的返回类型是布尔值。因此,pf就是一个指向函数的指针,其中该函数的参数是两个const string的引用,返回值是bool类型。 注意:*pf两端的括号必不可少,如果不写这对括号,则pf是一个返回值为bool指针的函数: //声明一个名为pf函数,该函数返回bool* bool *pf(const string&,const strng&); 使用函数指针 当我们把函数名作为一个值使用时,该函数自动地转换成指针。例如

JavaScript异步编程——Async/Await vs Promise

杀马特。学长 韩版系。学妹 提交于 2020-03-02 21:02:19
兼容性 提醒一下各位,Node 现在从版本 7.6 开始就支持 async/await 了。而就在前几天,Node 8已经正式发布了,你可以放心地使用它。 如果你还没有试过它,这里有一堆带有示例的理由来说明为什么你应该马上采用它,并且再也不会回头。 Async/await 对于那些从未听说过这个话题的人来说,如下是一个简单的介绍: Async/await 是一种编写异步代码的新方法。之前异步代码的方案是回调和 promise。 Async/await 实际上是建立在 promise 的基础上。它不能与普通回调或者 node 回调一起用。 Async/await 像 promise 一样,也是非阻塞的。 Async/await 让异步代码看起来、表现起来更像同步代码。这正是其威力所在。 语法 假设函数 getJSON 返回一个 promise ,而该 promise 的完成值是一些JSON对象。我们只想调用它,并输出该JSON,然后返回 "done" 。 如下是用 promise 实现的代码: const makeRequest = () => getJSON() .then(data => { console.log(data) return "done" }) makeRequest() 而这就是用 async/await 看起来的样子: const makeRequest =

ES6的待办事项列表应用程序(todo list app with ES6)

Deadly 提交于 2020-03-02 20:14:25
ES6的待办事项列表应用程序 示例 CSS JS 示例 CSS @import url('https://fonts.googleapis.com/css?family=DM+Sans:400,500,700&display=swap') ; * { box-sizing : border-box ; outline : 0 ; } :root { --font : 'DM Sans' , sans-serif ; } body { background-image : linear-gradient ( 102.7deg, rgba ( 253,218,255,1 ) 8.2%, rgba ( 223,173,252,1 ) 19.6%, rgba ( 173,205,252,1 ) 36.8%, rgba ( 173,252,244,1 ) 73.2%, rgba ( 202,248,208,1 ) 90.9% ) ; background-attachment : fixed ; display : flex ; flex-direction : column ; background-repeat : no-repeat ; background-size : cover ; padding : 20px ; height : 100vh ; overflow :

javascript: Object对象生成URL参数

牧云@^-^@ 提交于 2020-03-02 20:01:40
code: function makeQuery(queryObject) { const query = Object.entries(queryObject) .reduce((result, entry) => { result.push(entry.join('=')) return result }, []).join('&') return `?${query}` } sample: const queryObject = {name: "nameValue", code: "codeValue"}; const objectEntries = Object.entries(queryObject) => [["name","nameValue"],["code","codeValue"]] const arrayReduce = objectEntries.reduce((result, entry)=> {   result.push(entry.join("="));   return result }, []) => ["code=codeValue","name=nameValue"] `?arrayReduce.join('&')` 来源: https://www.cnblogs.com/Nyan-Workflow-FC/p/11115302.html

普天C++笔试题

痞子三分冷 提交于 2020-03-02 16:43:51
1.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数; 答: //假设线性表的双向链表存储结构 typedef struct DulNode{ struct DulNode *prior; //前驱指针 ElemType data; //数据 struct DulNode *next; //后继指针 }DulNode,*DuLinkList; //删除操作 Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e) { if(!(p=GetElemP_DuL(L,i))) //此处得到i位置的节点指针,如果有需要也得写出具体函数实现 return ERROR; e=p->data; p->prior->next=p->next; p->next->prior=p->pror; free(p); return OK; } //插入操作 Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e) { if(!(p=GetElemP_DuL(L,i))) return ERROR; if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; s->data=e; s->prior=p->prior; p-

ACM模板(持续补完)

半腔热情 提交于 2020-03-02 15:15:36
KMP 1 #include<cstring> 2 #include<algorithm> 3 #include<cstdio> 4 using namespace std; 5 const int maxn=2000; 6 char a[maxn+50],s[maxn+50]; 7 int next[maxn+50][maxn+50]; 8 int len1,len,t; 9 int main() 10 { 11 scanf("%d\n",&t); 12 while(t--) 13 { 14 s[0]='0'; 15 scanf("%s",s+1); 16 len=strlen(s); 17 for(int k=1;k<len;++k) 18 { 19 int j=k-1; 20 next[k][k]=k-1; 21 for(int i=k+1;i<len;++i) 22 { 23 while(j>=k&&s[j+1]!=s[i]) j=next[k][j]; 24 if(s[j+1]==s[i]) ++j; 25 next[k][i]=j; 26 } 27 } 28 long long ans=0; 29 for(int k=1;k<len;++k) 30 { 31 int j=k-1; 32 for(int i=1;i<len;++i) 33 { 34 while(j>=k&

C++的四种新式显示转换和一种旧式显示转换

我的未来我决定 提交于 2020-03-02 14:48:45
C++的四种新式显示转换和一种旧式显示转换 1、静态转换(static_cast) static_cast包含的转换类型有 典型的非强制变换 、 窄化(有信息丢失)变换 、 使用void*的强制转换 、 隐式类型 变换 、 类层次的静态定位 。static_cast是编译器允许的。 ‍ (1)典型的非强制变换 ‍ 从窄类型向宽类型的转换,如char向short int,int,long int,float,double,long double的转换。 char a = 1; long b = static_cast<long>(a); ‍ (2)窄化变换 ‍ 与第1种相反,从宽类型向窄类型的变换。 long b = 1; char a = static_cast<char>(b); (3)使用void*的强制变换 任何非 const 型指针都可以赋予 void*,void* 被用于对象的确切类型未知或者特定环境下对象类型发生变化的情 况下 ! 但 void* 不能直接被解除引用 , 因为没有类型信息可用来知道编译器怎么解释低层位模板 !void* 必须转换 成某类型的指针 , 在 C++ 中没有 void* 到特殊类型的自动转换 ! 必须显示强制转换 ! struct callback_param { void *vp; }; int a = 1; struct callback

C++ sort()对结构体排序

☆樱花仙子☆ 提交于 2020-03-02 12:58:39
重写仿函数(函数指针法) #include<iostream> #include<algorithm> using namespace std; struct stu{ int num; float score; }; bool cmp(const stu &a, const stu &b){ return a.score < b.score; } int main(){ stu nums[3] = {{1,98.5}, {2,88.5}, {3,68.5}}; sort(nums, nums + 3, cmp); for(int i = 0; i < 3; ++ i) { cout << nums[i].score <<endl; } return 0; } 重载运算符(struct内部 + struct外部) #include<iostream> #include<algorithm> using namespace std; struct stu{ int num; float score; bool operator<(const stu &a) const { return score < a.score; } }; int main(){ stu nums[3] = {{1,98.5}, {2,88.5}, {3,68.5}}; sort(nums, nums + 3)

gulp处理文件

房东的猫 提交于 2020-03-02 10:58:48
通常,我们使用gulp提供的src()和dest()方法处理文件 如: const { src, dest } = require('gulp'); exports.default = function() { return src('src/*.js') .pipe(dest('output/')); } 在项目中,我们经常使用babel格式化下我们的代码,在写入输出的相关目录。 const { src, dest } = require('gulp'); const babel = require('gulp-babel'); exports.default = function() { return src('src/*.js') .pipe(babel()) .pipe(dest('output/')); } 如执行前gulpfile.js文件内容如下: const { src, dest } = require('gulp'); const babel = require('gulp-babel'); function test(){console.log("hello world")} var name = "huangbaokang"; var age=30; obj ={"author":"huangbaokang",age:30} exports.default