
C
文章平均质量分 55
北京-大白
这个作者很懒,什么都没留下…
展开
-
内存对齐
概念:是一个数据类型所能存放的内存地址的属性又称字节对齐。如一个数据类型的内存对齐为8时,这个数据类型所定义出来的所有变量其内存地址都是8的倍数。 自然对齐:对齐属性和数据类型的大小相等,如4字节大小的int型数据默认它的字节对齐也是4。 目的:内存对齐可以提高CPU读取内存的效率。(32位的x86 CPU,一个时钟周期可以读取4个连续的内存单元,即4字节),如一个int放在奇数内存位置上,想把...原创 2018-04-02 23:18:10 · 144 阅读 · 0 评论 -
回调函数
函数指针:指向函数入口地址 void Invoke(char* s); int main() { void (*fp)(char* s); //声明一个函数指针(fp) fp=Invoke; //将Invoke函数的入口地址赋值给fp fp("Hello World!\n"); //函数指针fp实现函数调用 ...原创 2018-04-02 23:24:21 · 168 阅读 · 0 评论 -
自定义printf写法
int vprintf(const char *format, va_list arg) 发送格式化输出到stdout使用一个参数列表传递给它。printf就是用vprintf写的。定义自己的printf函数ETRACE如下: void ETRACE(const char* strLogStr,...) { va_list args; va_start(args, strL...原创 2018-04-02 23:31:53 · 6694 阅读 · 0 评论 -
c/c++ 线程池
概念 原理 线程池简单来说就是有一堆已经创建好的线程(最大数目一定),初始时他们都处于空闲状态,当有新的任务进来,从线程池中取出一个空闲的线程处理任务,然后当任务处理完成之后,该线程被重新放回到线程池中,供其他的任务使用,当线程池中的线程都在处理任务时,就没有空闲线程供使用,此时,若有新的任务产生,只能等待线程池中有线程结束任务空闲才能执行 为什么使用线程池 因为线程的创建、和清理都是需要...转载 2018-05-02 21:24:00 · 2114 阅读 · 1 评论 -
c/c++ 标准输入输出缓冲区刷新
在一次编写用QProcess接收程序运行结果的代码中,发现可执行程序使用print cout等打印运行结果,如果不加换行符就打印不出结果后来查阅网上资料得知,换行符的作用就是刷新缓冲区,因此添加缓冲区刷新代码即可或者直接关闭缓冲区. 刷新方式: fflush(stdout) setbuf(stdout, NULL); setvbuf(stdout, (char *)NULL, _IONBF, ...原创 2018-05-25 10:28:03 · 3515 阅读 · 0 评论 -
linux 显式链接so库
linux加载程序变成进程的过程 fork进程, 在内核创建进程相关内核项, 加载进程可执行文件 查找依赖的so库, 加载映射虚拟地址 初始化程序变量 动态库依赖越多, 进程启动就越慢, 并且发布程序的时候, 这些链接但没有使用的so同样要一起跟着发布, 否则进程启动时候找不到对应的so导致启动失败. 一些查看依赖的命令 查看依赖关系: readelf -d xx.so 查看链...原创 2018-06-08 10:49:56 · 2473 阅读 · 0 评论 -
九大排序算法
参考链接 九大排序算法,你会几个? visualgo 排序算法时间复杂度、空间复杂度、稳定性比较 排序分类(9) 1. 插入排序 直接插入排序 难度:简单 必须掌握 思路:将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表 图示: 算法复杂度:O(n^2) ;稳定算法 代码: void InsertSort(int a[],int n) { ...原创 2018-10-10 17:37:10 · 1155 阅读 · 0 评论