随笔分类 - C++
摘要:多叉树存储的方式: 采用链表的方式维护子节点,每个结点的child指针指向子节点链表的首节点。通过next指针即可遍历子节点链表。 采用迭代器模式的设计思路,封装了多叉树dfs遍历接口:iterator_node以及bfs遍历接口:iterator_leval_node。 iterator_node
阅读全文
摘要:C++通过以下两个运算符进行运行时类型识别: 1. typeid 查询类型的信息 在使用typeid前需要包含typeinfo头文件。 #include <typeinfo> 当typeid查询多态类型表达式时,将会有虚表查找的开销,查询其他表达式在编译前即完成。 可以通过typeinfo::nam
阅读全文
摘要:std::thread_local是线程局部存储。每个线程都有一个对应备份,被std::thread_local修饰的变量生存周期和所属线程一致,线程被销毁该变量释放。 可以用以下代码观察: #include<iostream> #include<thread> using namespace st
阅读全文
摘要:std::initializer_list<T>提供了以下接口: size_t size() const noexcept; const T* begin() const noexcept; const T* end() const noexcept; 通过std::initializer_list
阅读全文
摘要:以读或写打开一个FIFO会阻塞到另一端也打开。 当open一个FIFO时,非阻塞标志(O_NONBLOCK)会产生下列影响: 没有指定O_NONBLOCK,只读open要阻塞到某个其他进程为写而打开这个FIFO为止。类似的,只写open要阻塞到某个其他进程为读而打开它为止。 如果指定了O_NONBL
阅读全文
摘要:1 #ifndef PROCESS_LOG_H 2 #define PROCESS_LOG_H 3 4 #include <string> 5 #include <sstream> 6 #include <cstring> 7 8 #include <fcntl.h> 9 #include <sys
阅读全文
摘要:直接把注释写到代码中: int __pthread_mutex_lock (pthread_mutex_t *mutex) { unsigned int type = PTHREAD_MUTEX_TYPE_ELISION (mutex); //安全检查 LIBC_PROBE (mutex_entry
阅读全文
摘要:c++11的thread库提供了获取tid的接口: std::this_thread::get_id() 这个接口返回的是一个内存地址指向表述线程的结构体(pthread也是一样)。 有的时候这种方式获取的pid过长,可以使用syscall获取lwp,也就是top -H中看到的id,但也要注意sys
阅读全文
摘要:当两个头文件a.h和b.h存在相互引用的状况时,可以在其中一个头文件预先定义类型。如: // A.h class B; class A{ B data; public: void fun(); }; //B.h #include "A.h" class B{ public: int data; }
阅读全文
摘要:看书看到这个地方,使用&运算计算hash对应的下标。 两个数&运算得到小于等于两个数中最小的值,位运算比%运算效率更高。
阅读全文
摘要:涉及到以下汇编指令: pushl: 入栈 ebp指向栈底 esp指向栈顶 入栈时只需要将esp下移, 将入栈的值放入esp指向的地址,如下图所示: popl: 出栈 先将栈顶的数据保存,再将esp上移 call:顾名思义,调用一个函数 调用一个函数需要将当前执行到的指令位置(eip寄存器的值)保存,
阅读全文
摘要:函数重载是一种特殊情况,C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。 为了实现函数重载的功能,函数名就不能再作为一个函数的唯一标识,而是使用了name-mangling方法将函数名转化为了一个独一无
阅读全文
摘要:不要将函数的返回值设为&&, std::string &&get(){ std::string s = "str";return std::move(s); } 代码中返回的字符串s在函数返回时就已经离开作用域调用析构函数,函数的得到的返回值其实是一个野指针。
阅读全文
摘要:使用gettimeofday(),没有系统调用的开销。 std::string getTime(void) { timeval tv; tm * time; std::stringstream ss; if(gettimeofday(&tv, nullptr) == -1){ throw errno
阅读全文
摘要:int power(int x) { return x * x; } int main() { int x = power(2); //cout << v.str[0] << endl; return 0; } 对于返回值比较偏小的函数,直接将返回值保存至寄存器。 这里先将x的值保存至eax中,在用
阅读全文
摘要:对于std::list,最基本的遍历方式可能是这样的: list<int> l = { 0,1,2,3,4 }; for (list<int>::iterator it = l.begin(); it != l.end(); i++) { cout << *it << endl; } std::li
阅读全文
摘要:记录一下这几个容易混淆的概念。 可移动构造(MoveConstructible) 指定该类型的实例可以从一个右值实参构造 定义 给定: T类型的右值表达式rv 任意标识符 u 下列表达式必须合法且拥有指定的效果: T u = rv; //u 的值等于 rv 在初始化前的值。rv 的新值未指明。T(r
阅读全文
摘要:lamada表达式的语法 [capture](parameters)->return-type {body} demo: #include <iostream>#include <functional>using namespace std;void fun(function<int(int,
阅读全文
摘要:1 #include <iostream> 2 #include <time.h> 3 4 using namespace std; 5 6 char buf1[10010] = { 0 }; 7 char buf2[10020] = { 0 }; 8 9 void *myMemcpy(void *
阅读全文

浙公网安备 33010602011771号