![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c/c++
文章平均质量分 72
馒头2870
这个作者很懒,什么都没留下…
展开
-
【leveldb】basename/dirname中的坑
最近阅读leveldb中代码的时候发现,leveldb自己实现了basename和dirname的功能,并没有使用glibc自带的函数,觉得比较奇怪,去查文档然后动手实践后发现原来这里面有个一不小心就会踩到的坑。man手册中提到,posix版本的glibc实现会改变basename/dirname的参数,而且在使用静态字符串如/usr/调用时会引起段错误。自己调试发现,dirname会改变参数,并将最后一个/改成\0,如下执行到dirname时,原来的这个字符串p就已经被改变了,并且导致strlen原创 2021-01-19 20:45:44 · 305 阅读 · 0 评论 -
【leveldb】从EncodeFixed64来看汇编层面的性能优化
前言 最近在读leveldb的代码,看到了EncodeFixed64的写法感觉很不解,为什么要写的这么繁琐晦涩,把整数存在一个char数组中不是一句sprintf就解决了吗?深挖之后,还真不是这么简单从git提交记录查起 从github上看关于这个函数最近的一个提交,Remove leveldb::port::kLittleEndian。 提交内容中写道:Clang 10包含了以下描述的优化https://bugs.llvm.org/show_bug.cgi?id=41761。 这意味着 {D原创 2021-01-16 16:39:07 · 468 阅读 · 1 评论 -
【leveldb】varint 讲解和实现
前言 leveldb中为了减少内存占用,使用了varint这一数据结构,把数字放到字符数组中来表示,思想就是把小数字用尽量少的字节来表示,每个字节只使用其中的7位,最高位用来表示是否还有剩余的数字,0代表没有,1代表有。encode代码下面是encode的代码#include <stdio.h>#include <inttypes.h>#include <string>char *encode_varint32(char *dst, uint32_t原创 2021-01-08 00:52:06 · 435 阅读 · 0 评论 -
【网络编程】网络编程的坑
echo服务阻塞 假设这样一个简单的echo场景:客户端向服务端发送20M的数据,发送完之后接收数据,而服务端每次接收4k数据,接受完全部数据之后进行回显。这样的客户端和服务端程序启动之后,会意外的阻塞。阻塞的点在哪里呢 因为客户端发送完数据之后才会进行接收数据,而服务端接收到了4k数据之后就会进行回显,这时服务端发送到客户端的内核缓冲区中,注意这时客户端并没有读取数据,所以客户端的接收缓冲区中的数据一直积累,直到积累到某个阈值,此时服务端的tcp advertised window大小为0,tcp原创 2020-12-18 18:44:06 · 235 阅读 · 2 评论 -
Google C++编程风格指南阅读笔记之命名、注释和格式
前言本文源自Google C++编程风格指南,砍掉了其中比较common的部分,保留了个人认为最有价值的部分,并合入了自己的理解。原文下载连接:Google C++编程风格指南命名约定类型命名类型名称的每个单词首字母均大写,不包含下划线如:MyExecitingClass,IOService变量命名变量名一律小写,单词之间使用下划线连接。类和结构体的成员变量以m_开头(原文是类的成员变量以_结尾,结构体不用)枚举命名枚举的命名应当和宏一致宏的命名宏的命名使用全大写字母加下划线,如MY_M原创 2020-12-11 16:58:55 · 281 阅读 · 0 评论 -
c语言使用宏和##__VA_ARGS__支持函数默认参数
话不多说,参见如下代码 #include <stdio.h> #define test(a, ...) test_core(a,(NULL,##__VA_ARGS__)) int test_core(int a, char *ptr){ if(ptr == NULL){ return a+10; } printf("%s\n", ptr); return a+100; } int main(){原创 2020-11-20 16:27:20 · 493 阅读 · 0 评论 -
Effective Modern C++读书笔记:auto(条款5-6)
优先选用auto,而非显示类型声明1. 摆脱繁杂的类型声明2.避免踩坑1)使用auto与使用std::function声明闭包的对比//使用std::function声明一个闭包std::function<bool(const std::unique_ptr<Widget>&, const std::unique_ptr<Widget>&)> func = [](const std::unique_ptr<Widget&原创 2020-11-19 22:17:31 · 99 阅读 · 0 评论 -
数组是数组!指针是指针!它们完全不同!
#include <stdio.h> /* book1 程序员面试宝典 * book2 王道程序员求职宝典 * * 数组和指针的区别与联系: * 1. 先要分清,数组是数组,指针是指针,这是两个截然不同的概念 * 分清概念后,那么以下情形就不难理解: * 在test.h中声明extern int *a,但是在test.c中使用ina a[]会编译错误, * 因为数组和指针是两个概念,声明了指针却定义数组当然会报错! * 2. 数组保存数据,原创 2020-11-13 21:02:38 · 403 阅读 · 0 评论 -
centos7安装vim8以及YCM等插件
准备:升级到vim8,升级到gcc最新版本,安装一些依赖安装依赖yum install python python3 python3-devel gcc gcc-c++ cmake -y升级vim8:首先卸载原先的vim:yum remove vim因为github下载vim源码过慢,所以通过wget的方式来下载:升级gcc:首先下载源码:$ wget http://ftp.gnu.org/gnu/gcc/gcc-8.3.0/gcc-8.3.0.tar.gz然后解压并进入该目录:原创 2020-11-04 18:12:15 · 662 阅读 · 0 评论 -
c/c++中extern “C”的作用
c++和c语言混合编程时经常可以看到如下代码:#ifdef __cplusplusextern "C"{#endif//codes#ifdef __cplusplus}#endif因为c++支持函数重载,函数名符号会被破坏,会根据函数参数的不同重新生成函数符号如编译没有extern c的代码后,查看函数符号:void test1(){}void test2(){}void test3(){}int main(){ test1(); test2(); te原创 2020-08-29 11:40:44 · 149 阅读 · 0 评论 -
libev中的gcc内嵌函数
在学习libev的过程中,遇到了大量的gcc内嵌函数,大多是为了提升性能而使用的,这里做一个汇总和介绍,持续更新1、__builtin_expect:该函数是gcc引入的,为的是让程序员讲最有可能执行的分支告诉编译器,达到性能提升的效果源码://判断GNU版本号,如果不是gcc编译器,则不使用__builtin_expect函数//否则如果主版本号大于major或者主版本号等于major但是次版本号大于minor则返回真 否则返回假//__GNUC__ 、__GNUC_MINOR__ 、__GN原创 2020-07-29 22:01:18 · 154 阅读 · 0 评论 -
libev学习之突发奇想:c语言强取“派生类“的成员
c语言没有类的概念,更没有基类和派生类的概念,但我们可以通过一些手段来实现所谓的派生类在学libev源码中,可以看到很多c语言实现的基类和派生类的概念。这里简化的实现了一下,并且通过基类的指针强行取到派生类的成员(但这种做法并不可取)#include <stdio.h>//这里定义基类的所有成员#define BASE \ int a;struct base{ BASE};struct extend{ BASE int b;};typed原创 2020-07-29 21:18:20 · 90 阅读 · 0 评论 -
c语言实现函数重载
借用gcc内置函数__builtin_choose_expr和__builtin_types_compatible_p可以帮助c来实现函数重载。首先对这两个函数功能做下介绍__builtin_choose_expr(expr,expr1,expr2)与c语言:?运算符有些类似,如果expr表达式为真,那么返回expr1,否则返回expr2__builtin_types_compatible_p(type1,type2)测试type1与type2是否相同,如果相同返回真,否则返回假代码#includ原创 2020-07-29 20:05:59 · 2608 阅读 · 0 评论 -
gdb使用
disassemble /rm:反汇编/r指示显示十六进制的计算机指令(raw instruction)/m指示显示汇编指令的同时,显示相应的程序源码原创 2020-06-19 15:40:04 · 300 阅读 · 0 评论 -
捕捉段错误信号,产生core文件,而不使进程挂掉
这几天老大给了个需求,说要让程序在出错的时候像python那样打印堆栈,于是网上一顿搜(面向谷歌编程),大多是说用exeinfo.h里的trace_back等函数,但无意间看见了一篇帖子,可以在程序中调用gdb打印堆栈,更加方便。附源码如下:#include <stdio.h>#include <string.h>#include <sys/wait.h>#include <sys/types.h>#include <unistd.h>原创 2020-05-10 21:57:01 · 837 阅读 · 0 评论