![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++笔记
飞鸟真人
这个作者很懒,什么都没留下…
展开
-
c++封装libxml2解析网页
有页面不符合XML规范,节点没有闭合,造成XPATH搜不到任何东西,主要是解析树时候名字丢失了,但是通过自己手写深度递归查找还是可以的,原创 2023-03-03 10:14:58 · 206 阅读 · 0 评论 -
使用Scintilla编写语法高亮文本编辑器
使用Scintilla控件,在MFC的对话框中添加一个语法高亮的文本编辑器,原创 2023-02-20 13:22:22 · 857 阅读 · 0 评论 -
使用luaBridge向C++程序添加脚本插件能力2(类扩展)
使用luaBridge编写一个c++的lua插件,测试类的绑定与脚本使用原创 2023-02-16 08:33:33 · 133 阅读 · 0 评论 -
使用luaBridge向C++程序添加脚本插件能力1(编译与使用)
使用luabridge快速的编写与LUA的接口,实现脚本扩展能力。原创 2023-02-15 10:35:51 · 529 阅读 · 0 评论 -
c++的字节序与符号位的问题
易错题整理,字节序原创 2022-07-04 14:03:50 · 14412 阅读 · 0 评论 -
switch case 与map哪个效率高?
从直觉来看,应该是map高,因为通过索引来对比应该比反复的判断并jmp来的快,但事实上违反直觉的是,当少量的键值对查找时候,发现switch快了一倍多!!!// justTestit.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>#include <map>#include <unordered_map>#include <regex>#include "MyTimer.h原创 2022-05-31 16:41:10 · 1731 阅读 · 1 评论 -
linux使用c++调用脚本获取数据
脚本参考之前的文章,代码如下:#include <bits/stdc++.h>using namespace std;static inline std::string execute_command(const char *cmd){ if (cmd == NULL) { return ""; } FILE *fp = popen(cmd, "r"); if (NULL == fp) { re原创 2022-05-18 08:52:44 · 357 阅读 · 0 评论 -
std::setw的坑
关于setw的使用,看一下示例: cout << setw(5) << "12345" << "\n"; cout << setw(5) << "1234" << "\n"; cout << setw(5); cout << "1234" << "\n"; cout << setw(5); cout << "1"; cout << "2";原创 2022-05-18 08:18:30 · 246 阅读 · 0 评论 -
clickhouse使用c++接口访问
官方提供了客户端,地址:https://github.com/ClickHouse/clickhouse-cpp下载后,使用ubuntu18.04编译:mkdir buildcd buildcmake ..make -j8生成的文件在build目录,新建一个目录cd ..mkdir robincd robin将静态库拷贝过来libabsl-lib.alibcityhash-lib.alibclickhouse-cpp-lib-static.a li.原创 2022-03-17 13:41:27 · 4221 阅读 · 3 评论 -
高并发rpc的http1.1客户端
在上传信息的应用中,或者RPC应用中,http client很重要,但是curl满足不了需求,所以需要一个更快的客户端,于是有了LibNet原创 2022-03-10 21:02:59 · 2480 阅读 · 1 评论 -
使用线程本地存储实现无锁计数器
无锁编程可以防止功能模块称为并发的瓶颈,线程本地存储是一个很好的手段,写时分离,读时合并原创 2022-03-09 14:24:03 · 92 阅读 · 0 评论 -
多线程如何实现高性能计数器(无锁)
多线程协作免不了使用计数器,c++一般会使用锁,或者原子变量操作,std::mutex mutexCounter;int count;void add(){ std::lock_guard<std::mutex> guard(mutexCounter); count ++;}std::atomic<int> count;void add(){ count ++;}在性能要求比较高的情况下,这样的代码100%是会真个业务的瓶原创 2022-03-07 13:47:20 · 874 阅读 · 5 评论 -
使用http1.1协议做高效RPC (15W tps)
http1.1协议支持长连接,支持pipelining;1)http头设置keep-alive选项,tcp socket连接服务器后,双方不再轻易断开,这样可以减少建立连接所需要的开销;2)pipelining是服务器支持流水线机制,客户端不需要等待response,而不停的发送request,异步等待应答并解析;在网络时延比较大的情况下,如果使用pipelining机制可以很好的避免网络时延造成的性能下降;但是我所使用的HttpLib客户端是使用同步获取的;即便是Curl在目前的版本也并不支持原创 2022-02-28 15:37:56 · 2676 阅读 · 0 评论 -
c++语言的printf 与 运算符++
int main(){ int i = 0; printf("%d, %d, %d \n", i++, i++, i++); printf("%d, %d, %d \n", ++i, ++i, ++i); return 0;}输出结果:2, 1, 06, 6, 6原创 2022-02-19 08:24:05 · 408 阅读 · 0 评论 -
libcurl的坑
libcurl其实用起来很烦,如果简单的需求,完全可以使用httplib代替,原创 2022-01-21 12:14:17 · 490 阅读 · 0 评论 -
几个比较快的c++ 的json库(YYJSON)
几种json库对比之前的rapidjson与protobuf对比:https://blog.csdn.net/robinfoxnan/article/details/1187343871、yyjson按照官方说法,比rapidjson还要快,尤其是大文件;优点是:使用.h与.c一对文件,不需要依赖第三方库;代码地址:https://github.com/bulice/yyjson解码接口比较简单容易理解:void test1(){ Timer timer; timer.start();原创 2022-01-20 13:39:18 · 3408 阅读 · 0 评论 -
茴香豆的茴有多种写法 (之 线程池)
线程池一般用来负责处理异步事件,通常是建立一组线程,当有任务需要执行时,将任务推入线程池进行操作;不同在于1)推入队列的可以是处理函数,也可以是单纯的事件数据;如果是处理函数可以是函数指针或者lamda表达式,在线程激活后直接执行函数体;如果时推入的是数据,则可以根据数据类型加载不同的处理单元执行不同的处理;姑且称之为“操作早绑定”和“操作晚绑定”。2)线程池中共享单个任务队列,也可以每个线程单独拥有一个任务队列,用途不同;这里描述如下:一般来说,任务执行时间长,可以采用这样的模式;原创 2022-01-03 22:05:45 · 231 阅读 · 0 评论 -
c++也可以优雅的解析命令行参数
上代码:#pragma once#include <string>#include <sstream>#include <map>#include <functional>#include <inttypes.h>using namespace std;using UsageHandle = std::function<void (void)>;static std::map<string, string原创 2021-12-31 09:52:48 · 918 阅读 · 0 评论 -
constexpr 关键字优化 字符串映射与查找
需求:1)执行期间将文件名的扩展映射为具体的内容信息返回;2)可以理解为键值对查找;解决方法:1)普通的解决方案:使用std::map<string, string>管理并查找;2)constexpr解决方案:直接写为switch case 方式;先内联2个函数,作为字符串转int的哈希:inline constexpr unsigned int str2tag_core(const char *s, size_t l, unsigned int h..原创 2021-12-24 12:07:43 · 588 阅读 · 0 评论 -
protobuf_cpp 序列化为json
C++ 实用技术 - google protobuf反射技术 - 转成JSON格式_sylar的专栏-CSDN博客C++ 实用技术 – google protobuf反射技术 – 转成YAML格式 – sylar的博客C++ 实用技术 – google protobuf反射技术 – 基础API – sylar的博客我的需求是将多种proto的实体类序列化为json,这在c#版本中已经提供了,但是这里还是需要自己写;我使用的是json11库#include <iostream>原创 2021-12-20 14:35:32 · 679 阅读 · 0 评论 -
cmake 编译protobuf-cpp3.x
下载地址:Releases · protocolbuffers/protobuf · GitHubwindowscd cmakemdir buildcd buildcmake -G "Visual Studio 15 2017" ../linuxcd cmakemdir buildcd buildcmake ../原创 2021-12-18 11:36:59 · 481 阅读 · 0 评论 -
centos手动安装vscode
官网地址:Documentation for Visual Studio Code下载地址:https://az764295.vo.msecnd.net/stable/fe719cd3e5825bf14e14182fddeb88ee8daf044f/code-stable-x64-1639449126.tar.gz1) 解压缩2)移动到/usr/local目录下mvVSCode-linux-x64 /usr/local/# 给权限chmod +x /usr/local/VS.原创 2021-12-16 08:39:41 · 1033 阅读 · 3 评论 -
ubuntu18.04 编译open-telemetry-cpp (opentelemetry c-sdk)
open telementry是一个开源的智能运维探针,这个东西有各种语言的版本,这里编译下C-SDK原创 2021-12-06 13:36:34 · 843 阅读 · 0 评论 -
c++11与c风格路径拼接速度对比
c++11的std库中没有提供路径拼接的功能,比如我需要将 "d:\\temp\\robin" 和 "..\\config.ini" 路径拼接,这里用c++11的stingstream实现一个:string& replace_str(string& str, const string& to_replaced, const string& newchars){ for (string::size_type pos(0); pos != string...原创 2021-12-03 17:41:18 · 730 阅读 · 0 评论 -
windows和linux环境 控制.dll和.so和.a导出函数表
1.windows控制DLL导出函数表有2种方式:第一种:函数前添加导出说明:#ifndef _DLL_H_#define _DLL_H_//防重复定义#if BUILDING_DLL# define DLLIMPORT __declspec (dllexport)#else /* Not BUILDING_DLL */# define DLLIMPORT __declspec (dllimport)#endif /* Not BUILDING_DLL */DLLIMP原创 2021-12-02 17:38:20 · 2024 阅读 · 1 评论 -
使用dependencies查看dll的依赖库
项目地址 https://github.com/lucasg/Dependencies以前的vc6自带一个depend ,但是在新的操作系统下已经不能用了,找了很久才找到这个,原创 2021-12-01 09:45:35 · 552 阅读 · 0 评论 -
三维向量绕轴旋转的c++实现
罗德里格的公式 :Rodrigues旋转公式_渣渣-CSDN博客_rodrigues使用OSG实现:inline osg::Vec3d rotate(osg::Vec3d & p, osg::Vec3d & r, double a) const{ osg::Vec3d data1 = p * cos(a) + (r ^ p) * sin(a) + r * (p * r) * (1 - cos(a)); return data1;}测试一下:osg::Vec3原创 2021-09-17 17:23:30 · 1247 阅读 · 0 评论 -
vscode 字体太小的问题,安装新字体
vscode很好用,但是字体太小了,尤其是linux版本,字都拥挤在一起;1)左侧字体小,可以【ctrl shift + 】或者【ctrl shift - 】来控制界面整体缩放;2)右侧字体太小,可以安装新的字体Fira_Code_v5.22.1 下载链接Fira Code | 为写程序而生的字体 - 简书2.2 windows安装字体在ttf文件上逐个双击,打开字体管理器,点安装;2.3 linux安装字体mkdir -p /usr/share/fo...原创 2021-09-12 23:11:57 · 951 阅读 · 0 评论 -
ubuntu编译osg
1、安装必备依赖库: sudo apt-get build-dep openscenegraph 这一步会出错,个别的安装失败2、安装OpenGL库: sudo apt-get install mesa-common-dev freeglut3 freeglut3-dev3、下载源码最新的release 版本: http://www.openscenegraph.org我使用的是3.6.5版本,解压mkdir buildcd buildcmake ../# 检查是否有错...原创 2021-09-12 22:59:14 · 392 阅读 · 0 评论 -
windows和linux上获取cpu以及内存占用率
《编程实现获取linux服务器cpu、内存和磁盘使用率》https://blog.csdn.net/wan_hust/article/details/32314701?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.control&spm=1001.2101.3001.4242废话不多说了,直接上代码:#pragma once#include <inttypes原创 2021-08-27 08:44:34 · 380 阅读 · 0 评论 -
使用long还是uint64_t ?
1. sizeof(long)与sizeof(long long) 是多少字节?Windows下:(32位和64位)cout << sizeof(long) << " , " << sizeof(unsigned long long) << endl;输出:4, 8在linux下,(64位)cout << sizeof(long) << " , " << sizeof(unsigned lon原创 2021-08-26 17:06:53 · 1063 阅读 · 0 评论 -
vc使用hiredis的几个填坑动作
1)hiredis使用了Win32_Interop一个库,这个库写的贼乱,导致与ws2_32.lib中的函数冲突,没有办法只能重新封装一个DLL,在其他的项目中使用DLL来处理;2)hiredis本身非线程安全,所以多个线程需要使用连接池来操作;3)hiredis默认使用MTD库,应该在c++---->代码生成的位置改为MDD库;4) 我也不知道redis客户端多久会被被超时替出来,所以需要使用ping命令检测一下是否重连;首先我们随便封装一下基础代码:RedisClientRe.原创 2021-08-19 15:14:19 · 591 阅读 · 0 评论 -
linux编译GDAL
1)https://github.com/OSGeo/PROJ https://proj.org/apt-get install sqlite3apt-get install libsqlite3-devtar xzvf proj-6.3.1.tar.gzcd proj-6.3.1./configuremakemake install生成的文件安装到了 /usr/local/lib目录下2)https://github.com/libgeos/geos...原创 2021-08-12 17:37:20 · 384 阅读 · 0 评论 -
libuv使用的若干个坑
1)tcp-echo-server文件演示的简单服务器,收动作结束时直接释放buf;注意:当客户端直接退出程序,这里会收到一个reset,这时buf是空值,如果使用内存池,则需要检测是否需要释放到池,否则下次从池里拿到一个空值!(所以glusterfs内存块都加了标记,检测是否是自己的)#include <stdio.h>#include <stdlib.h>#include <string.h>#include <uv.h>#define原创 2021-07-28 21:59:33 · 4982 阅读 · 2 评论 -
使用libuv封装一个uv-rpc
代码仓库原创 2021-07-28 20:59:21 · 426 阅读 · 0 评论 -
c++智能指针与lamda表达式
lamda表示使用[=]捕获,或者使用[&],或者捕获了智能指针shared_ptr,则会在闭包中保存一个引用,也就是增加了智能指针的引用计数,一不小心,就会造成内存泄露,解决发方法是:将保存lamda表达式发回调函数变量设置为nullptr; 比如下面代码:manager->cb = nullptr;备注:shared_ptr::reset()可以设置智能指针为空。#include <iostream>#include <memory>#inc.原创 2021-07-27 17:02:17 · 1399 阅读 · 0 评论 -
std::enable_shared_from_this到底有啥用?
网上很多文章磨磨唧唧也说不清楚,给出的示例没有啥参考价值,今天我说一下我的理解。我有一个需求,在类内部保留一个引用,即把自己的智能指针传递给其他的类:1)在类的内部是不能二次使用shared_ptr来引用自己的,这样会循环引用无法释放;2)这样就是内部需要一个weak_ptr来引用自己,但是这个值如何初始化是个问题:因为不能使用类似下面的语句直接初始化,weak_ptr<A> weak = this;但是,如果类从std::enable_shared_from_th原创 2021-07-26 21:39:08 · 553 阅读 · 0 评论 -
使用nodejs中的llhttp库实现http解码
IIHttpurl字段解析:https://github.com/netmindms/urlparserurl中的解码:https://github.com/int2e/UrlEncoder原创 2021-07-26 21:29:10 · 953 阅读 · 0 评论 -
rapidjson与protobuf对比测试
测试环境: windows10 x64 vs2017 编译release版本格式定义:任务包括ID号,和64个链路信息,链路中包括经纬度高程信息;syntax = "proto3";package pathloss;option optimize_for = LITE_RUNTIME;message req_job_t{ string job_id = 1; string time_str = 2; message link_info_t { int3.原创 2021-07-14 19:20:33 · 584 阅读 · 0 评论 -
茴香豆的几种吃法之内存池队列使用方式
对比new delete 与使用容器管理内存队列release_x64模式:new-delete 2000次: 0.2124 msstd::deque 出入队2000次: 0.0699 mslibuv 出入队2000次: 0.053 msstd::mutex mutex1;std::deque<const char *> bufs;void testMem(){ Timer timer; timer.start();...原创 2021-07-09 16:02:48 · 76 阅读 · 0 评论