C++
梦李寻欢
纸上得来终觉浅,绝知此事要躬行.
展开
-
数据库性能测试2:内存数据库
在内存模式下(相较与文件模式),duckdb与sqlite的写入性能都有较大的提升,而查询性能提升不大,可能是因为文件模式下,两者都会有缓存的原因。因为本次测试引入了我自己的一套内存数据库,相较于上一次的测试,本次对所有数据库增加了一个合约代码的索引,增加索引后,Duckdb的写入性能下降比较严重,而查询性能几乎没变。查询性能对比文件模式下,相差也不大,duckdb的内存模式下跟文件模式下查询耗时基本持平,sqlite内存模式比文件模式每次大约快1ms(约10%-25%)的样子。原创 2024-08-29 13:35:38 · 494 阅读 · 0 评论 -
protobuf与grpc编译
boringssl 中crypto编译错误,由于此工程编译需要访问golang的网页获取某些文件来生产 err_data.c 文件,没有翻墙工具的同学通常是无法完成的,我这里找另外一个有翻墙工具的同事帮忙生成了此文件,不过每次编译时候还要先失败一次,这时会在 grpc/build-dir/third_party/boringssl-with-bazel/crypto 目录下生成一个err_data.c 的文件,用准备好的err_data.c文件替换它再次编译即可。原创 2024-08-19 11:24:41 · 534 阅读 · 0 评论 -
使用Visual Studio 开发Linux C++项目
需要注意是,Visual Studio 提取头文件的过程相当的慢,会导致工程里面IntelliSense提升一大堆的错误,可以考虑使用远程工具将Linux头文件拷贝到本地缓存位置。Visual Studio 会在Linux系统上自动启动gdb,并使用Visual Studio 调试器的前端在Linux上提供完全保真的调试和体验。要使用Visual Studio 开发Linux C++项目,需要在安装时候勾选 Linux development with C++。仅CMake项目需要。原创 2024-07-29 14:47:43 · 360 阅读 · 0 评论 -
C++故障清单
在处理文本解析时有个地方必须要硬编码中文字符进去,于是遇到了这个问题。我这里的中文使用的UTF8编码,正确解析的情况下,是不会出现换行符的,这里肯定是编码识别出现了问题。看来是因为Source文件没有加BOM,被当做MBCS编码来解析了。这里使用Notepad++打开源文件,将其转换为带BOM的UTF8编码即可。C2001:常量中有换行符。原创 2023-12-29 16:45:44 · 355 阅读 · 0 评论 -
.NET发布程序故障排查
首先看到单击程序后,看到加载的小圆圈后,程序始终没有打开,也没有任何提示,遇到这种情况是很郁闷的,这种情况下可以查看windows 事件查看器 - Windows日志 - 应用程序,这里面可以看到最近崩溃的应用程序错误。当知道是缺少C++的库了后,其实可以针对所使用的C++库,写一个C++库的测试程序,然后在这个电脑上运行C++库的测试程序,这样,在运行时windows 会弹窗提醒具体缺少什么库。我这里遇到的问题是依赖于某个C++的库,而C++的库缺少所依赖的运行环境,也就是VS的一些运行时库。原创 2023-12-06 17:44:36 · 180 阅读 · 0 评论 -
.Net 字符集与编解码
如果参数是一个对象,而对象中的字符串类型需要在定义封装对象的位置,通过StructLayout 属性的CharSet 来设置。这里首先测试了.Net 在Windows环境下运行情况下,.Net 默认使用ANSI 编解码,其中在 DllImport 中指定的 CharSet 对导出函数的直接字符串参数生效。这里主要针对于使用C++ API是遇到的一些编码被封送的情况测试。跟上面类似,但是Unicode 传送的不成功,想必是类型问题,Unicode 对应C++中应该对应使用wchar* 数组。原创 2023-11-30 15:17:05 · 496 阅读 · 0 评论 -
C#使用C++动态库2
目前在封装class类型参数的字符串类型字段时,仅尝试 UnmanagedType.ByValTStr 类型成功,使用UnmanagedType.LPUTF8Str时会遇到 System.AccessViolationException 异常。C++回调函数里面的class的指针类型参数,在C#中还是用class来对应,在用struct的ref形式时遇到的一个问题是,C++的指针为空时,在回调时候会遇到 System.NullReferenceException 异常。原创 2023-08-23 16:44:09 · 453 阅读 · 0 评论 -
C++ Unicode、Utf8、GBK编码之间转换
C++标准库从C++11开始提供了std::codecvt_utf8和std::codecvt_byname两个转换器来完成编码转换,其中std::codecvt_utf8用于 utf8编码与unicode之间的转换,GBK与unicode之间的转换则需要通过std::codecvt_byname 来完成,并需要指定locale_name参数,此参数windows与linux下并不相同。原创 2023-06-09 14:17:00 · 2951 阅读 · 0 评论 -
snprintf 与 vsnprintf
由此可见,snprintf与vsnprintf在处理内存溢出的情况时,虽然对写入的内容做了截断处理,但是返回值却是包含溢出内容的值,如果在连续使用snprintf或者vsnprintf对一块内存进行写入的时候,使用了这个返回值而没有进行检查的话,就可能会导致内存越界错误。直到最近遇到的一个日志组件bug,调试了许久才发现原来是在使用这俩函数时,对溢出情况下,返回值的错误处理导致的,这里写了一个小测试。...原创 2022-07-28 14:42:32 · 524 阅读 · 0 评论 -
Ubuntu安装C++开发环境
1、安装g++:apt install g++2、安装gdb:apt install gdb3、安装cmake:apt install cmake4、安装Ninja: 1、安装依赖包re2c:apt install re2c 2、指定python链接:update-alternatives --install /usr/bin/python python /usr/bin/python3 1 3、下载ninja源码:git clone https://github.com/ni...原创 2022-04-11 16:55:38 · 5082 阅读 · 0 评论 -
getaddrinfo测试
对getaddrinfo 函数进行测试:在Windows和Linux环境下,IPv4的地址返回与输入均保持一致。在Windows环境下,IPv6地址返回的ai_family值为23,而在Linux下则为10。对于输入IP为 ::和::0 的情况,这两个环境返回的IP值均被置为 ::。Windows环境解析Linux的IPv6地址格式:fe80::20c:29ff:fed5:82f%ens33 失败,而Linux环境解析Windows的IPv6地址格式:fe80::59d8:5d6d:25原创 2022-01-04 18:06:07 · 1248 阅读 · 0 评论 -
C++使用UDP
对C++使用UDP做了简单封装,支持zlib压缩后发送数据。udp.h#pragma once#include "SocketInit.h"#include "TcpEvent.h"class Udp{ Udp();public: static Udp& GetInstance(); void SetBindAddress(const char* ip = "127.0.0.1", int port = 0); void SetRemoteAddress(const c原创 2021-11-04 16:20:23 · 28398 阅读 · 0 评论 -
ZLib库使用
简单做了下Zlib库的测试#include "zip/zlib.h"#include <iostream>using namespace std;int main(){ unsigned char buff[2048] = { 0 }; unsigned char compressBuff[2048] = { 0 }; unsigned char unCompressBuff[2048] = { 0 }; while (true) { ::memset(buf原创 2021-11-04 16:12:09 · 539 阅读 · 0 评论 -
C++时间转换及格式化
写了一些时间转换及格式化相关的函数,经测试能够跨平台使用,记录一下。#include <cstdio>#include <chrono>#include <iostream>using namespace std;time_t GetTime(){ std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); return std::chro原创 2021-11-02 18:19:34 · 4674 阅读 · 1 评论 -
CTP API对接与测试
CTP柜台在期货领域具有举足轻重的地位,其提供的API以代码风格的规范著称。近期实现了一下对其接口的测试,使用起来还是比较简单清晰的,发现的一个问题就是接口与字段太多了,对使用者的理解增加了不少难度,好在对大多数使用者来说,不需要搞清楚所有的接口和字段。因为CTP接口的规范性,我这里将其接口抽象成了了几种元素,进一步通过python脚本自动生成了一些代码,以达到对所有回调函数的所有字段进行日志记录的功能。同时对一些关键的接口进行了测试。因为篇幅限制,这里仅列出部分接口的代码实现,如果感兴趣可以移步Gi.原创 2021-04-22 13:49:33 · 893 阅读 · 0 评论 -
C++ 日志模块
最新实现了一个小巧灵活的日志模块,相关的知识点比较少,主要是存储的管理、线程同步以及可变参数的展开与传递。首先用模板和单例实现了一个缓存的管理类:MemCacheTemplateSingleton.h#include <list>#include <mutex>#pragma onceusing namespace std;template <typename T>class MemCacheTemplateSingleton{privat原创 2021-04-16 17:23:01 · 476 阅读 · 0 评论 -
C++ Aes与Rsa加密算法使用
AesTest.h#ifndef AES_TEST_H#define AES_TEST_H#include <openssl/aes.h>bool AesEncrypt(unsigned char* in, unsigned char* out, size_t len, const unsigned char* key, size_t keyLen = 32);bool AesDecrypt(unsigned char* in, unsigned char* out, si原创 2020-08-06 17:03:31 · 1021 阅读 · 0 评论 -
函数语法分析
这两天在做一个报送交易所交易系统信息的工作,任务内容是从已有的信息中取出配置文件指定的信息,按照指定的格式拼接好。为了实现一些扩展性,对配置项的语法进行了函数支持。在做这个事情的同时,顺便实现了一些字符串相关的函数。ParseSystemInfo.h#include <vector>#include <string>#pragma onceenum cla...原创 2020-04-09 15:34:16 · 307 阅读 · 0 评论 -
简易计算器
GitHubOperateFuncs.h:#pragma once#include <exception>template<class T>T add(T x, T y){ return x + y;}template<class T>T sub(T x, T y){ return x - y;}template<cla...原创 2020-03-04 13:43:40 · 131 阅读 · 0 评论 -
C++计时函数
#include <iostream>#include <string>#include <thread>#include <chrono>#if defined WINDOWS#include <Windows.h>#else#include <sys/time.h>#endifusing namesp...原创 2019-11-19 10:59:00 · 313 阅读 · 0 评论 -
C++单元测试框架
新写了一个简单的单元测试框架,测试用例抽象为TestCase对象,包含两个接口:bool exec_case();与void report_result();调用exec_case时,执行测试用例的单元测试函数(由具体的测试用例给出),将测试结果和相关信息记录下来;调用report_result时,将测试结果与相关信息输出。test_case.h#ifndef __h_te...原创 2019-11-13 14:01:23 · 523 阅读 · 0 评论 -
自动化编译工具
最近接手一个新的C++项目,写了一个自动化编译的脚本,包含单元测试的编译与执行。脚本文件:Compile.py# encoding:utf-8import osimport datetimeimport xml.etree.ElementTree as ETclass Target: def __init__(self): self.name = ""...原创 2019-11-13 13:43:49 · 366 阅读 · 0 评论 -
#和##在宏替换中的作用
摘自:http://blog.csdn.net/kingkai620/article/details/5905606文/kingkaihttp://blog.csdn.net/haoel/archive/2009/05/18/4197010.aspx,其中的PUZZLE 4给出了一个关于宏的谜题。值得研究。[c-sharp] view plaincopy#include转载 2015-08-17 16:28:06 · 694 阅读 · 0 评论 -
openssl编译
下载openssl源码https://www.openssl.org/source/这里选择的版本是1.1.0iopenSSL的编译要用activeperl下载activeperlhttp://www.activestate.com/activeperlnasmOpenSSL编译需要nasm(http://www.nasm.us), 下载并安装, 将nasm.exe加入...原创 2018-09-04 15:41:44 · 1130 阅读 · 1 评论 -
C++ 使用OpenSSL
最近在研究C++使用OpenSSL,前面的文章介绍了编译OpenSSL源码的过程,这里随便写下加密解密的用法。MD5:#include <openssl\md5.h>#include <iostream>using namespace std;int md5_encrypt(const void* data, size_t len, unsigned ch...原创 2018-09-04 15:59:58 · 12932 阅读 · 0 评论 -
C#使用C++动态库
今天对通过C#工程来调用C++的dll做了一些尝试,记录一些收获与遇到问题。C++ dll 代码:/**my_dll.cpp**/#include "UserApi.h"#define PB_API __declspec(dllexport) extern "C"{ typedef PB_API int(*SumFunc)(int a, int b); typedef P...原创 2018-09-27 17:25:53 · 887 阅读 · 0 评论 -
C++单元测试
最近写了一个的C++单元测试工具,在这里分享一下对测试用例(TestCase)的定义。其中用到的MDB是用C++写的内存数据库,ExpectMDB则是一个仅用set容器实现的简化版的数据库。测试用例的执行函数是一个返回值为bool类型的无参函数,测试用例执行完后的数据在MDB中,对执行结果的期望数据,通过CSV文件导入到ExpectMDB中,通过check_mdb_tables对两者中每个...原创 2019-07-16 10:40:55 · 1444 阅读 · 0 评论