
C++
wang_sun_1983
这个作者很懒,什么都没留下…
展开
-
如何优雅的写C++代码 Obotcha介绍(简单检测单元测试覆盖率的方法)
Obotcha已经写了快4年的,大约有44K行,4K个接口。对应的单元测试集()目前已经基本涵盖了大多数的模块,但是一直没办法确定有多少接口没有被测到。所以写了个简单的python脚本去做了一个统计。原创 2022-12-20 21:44:48 · 215 阅读 · 1 评论 -
如何优雅的写C++代码 Obotcha介绍(Synchronized实现)
C++实现synchronized原创 2022-11-05 20:03:28 · 247 阅读 · 0 评论 -
博客如何优雅的写C++代码 Obotcha介绍(ForEveryone函数)
循环遍历一个容器的数据的时候,我们都会使用foreach的语法,或者类似python/rust语言中的for xxx in container的语法,这样用起来非常爽。由于我在obotcha里面自己实现了ArrayList等容器,每次遍历都需要用比较繁琐的iterator原创 2022-10-30 22:56:12 · 331 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(shutdwon函数)
socket shutdown函数原创 2022-09-12 22:13:36 · 461 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(实现读写锁)
C++实现读写锁原创 2022-09-05 21:48:11 · 299 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(字符串转uint8_t)
结果value的数值竟然是49,直接是1的assic码,上网找了一下,貌似很多同学都遇到了这类问题。所以这里就直接用模板类做了区分,针对uint8_t的转化使用模板特例。默认都会走默认操作,uint_8的处理就走下面。原创 2022-08-21 15:27:53 · 1104 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(如何解决typedef重定义)
今天遇到一个比较郁闷的问题,Obotcha中用Byte来定义一个Byte实例(类似于java中的Integer),但是在第三方的zlib库中,它有个typedef定义Byte,用来表示unsigned char。所以只要zlib库和Obotcha的Byte.hpp一起include的时候就会出现编译报错。哈哈,下面我们来写一个代码简单表示一下:#include <tuple>#include <type_traits>#include <string>#inc原创 2022-05-11 21:52:27 · 384 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(转载in instantiation of member function requested here异常)
z智能指针和前置声明之间的小问题对比Go等其他语言的工程,C++工程让人痛苦的一件事情就是当工程稍微庞大一点,编译时间就蹭蹭蹭往上爬。一般来说看过Effective C++这本书或者其他类似书籍的人都知道要解决编译时长的问题,就要解决好和头文件之间的依赖关系。所以在任何必要的时候要首先考虑使用前置声明而不是之间include头文件。也就是说,在定义类的时候成员变量如果是自定义类型,可以考虑将其声明为指针类型或者是配合智能指针。函数传参时也是一样,使用指针或者引用。对于一个C工程来说,因为没有智能指.原创 2022-05-11 21:43:12 · 1502 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(如何返回多个数据)
我们写函数的时经常会遇到这样的情况,需要返回多个数据,例如:std::string getStudentInfo(int &i) { i = 100; return "wang"}这个函数原本的想法是想获得学生信息(名字,学号),但是返回值只能一个,怎么能同时返回(名字,学号)呢?额,当然,你说返回一个类啥的都可以,但是如果每次都是为了返回值创建一个类,那是不是有点繁琐啊。这里推荐大家使用std::tuple的方法来实现同时返回多个数据的返回数值。方法如下:#inc原创 2022-04-26 20:26:17 · 1010 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(使用模板获取class类型)
在使用std::bind的时候,我们经常会遇到这么个提示:error: decltype evaluates to ‘MyFunction&’, which is not a class or enumeration type对应的代码如下using HtmlTemplateFunction = std::function<int(std::vector<int>)>;class MyFunction {public: MyFunction()原创 2022-04-26 20:09:57 · 362 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(智能指针析构)
这个礼拜调试多线程偶现了一个栈溢出的问题:#0 0x55ba07 (/home/sunliwang/mysource/Obotcha/ObotchaTestSuite/testUtil/testConcurrent/testFuture/mytest+0x55ba07)#1 0x7f4008dad147 (../../../../out/lib/libobotcha.so+0x9ea147)#2 0x7f4008dad17f (../../../../out/lib/libobotcha.s原创 2022-01-18 22:33:52 · 1032 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(Lambda支持)
这个春节在家开始优化多线程的代码,发现多线程的使用上比较不方便,例如:我要创建一个线程,需要如下的步骤:1.创建一个Runnable的子类。如果有参数传递,那需要在构造函数中进行赋值DECLARE_SIMPLE_CLASS(RunCase2) IMPLEMENTS(Runnable) {public: _RunCase2(int v) { value = v; } void run() { //xxxxxxxx }private: int RunCas原创 2021-02-28 20:46:01 · 191 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(libco 移植)
这两天,主要干的事情就是研究了一下协程。哈哈,由于我本身是搞嵌入式的,基本上很少碰到用这个东东的。看网上说的这么神奇,貌似服务器上经常用协程来大规模并发时间,所以我决定也把协程引入进Obotcha。PS:最新的C++20貌似也有协程了,但是我现在用的是C++14,呵呵。暂时还木有~。协程库我用了libco,为啥用libco,主要是网上吹嘘说这个库是微信后台使用的,牛叉的很。Libco 是微信后台大规模使用的 C++ 协程库,在 2013 年的时候作为腾讯六大开源项目首次开源。据说 201...原创 2020-11-12 23:08:14 · 363 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(class命名冲突解决方法)
之前使用了google的glog来实现obotcha的log存储,但是最近编译的时候发现一个问题,Obotcha的Mutex类和glog的Mutex类冲突了。glog中Mutex定义如下:#define MUTEX_NAMESPACE glog_internal_namespace_namespace MUTEX_NAMESPACE {class Mutex { public: // Create a Mutex that is not held by anybody. Thi...原创 2020-09-26 10:08:24 · 203 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(简单的反射实现二)
Obotcha的反射基本已经都实现。目前能支持数据库,xml,json的ORM实现。template<typename T>void reflectTo(T obj)template<typename T>void importFrom(T value)JsonValue目前提供如上两个接口,reflectTo是将json数据直接导入到class对象中。importFrom是将class对象数据直接转成json数据。接下来我们看以下reflectTo和imp...原创 2020-09-20 21:10:38 · 175 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(简单的反射实现一)
最近又准备蠢蠢欲动开始写Sql的ORM了。但是ORM遇到的第一个问题就是C++没有反射!!!!。用过Java的同学都知道,使用Java的反射就能实现简单的ORM功能。奈何C++没有,只能自己实现一下了。主要实现代码如下: https://github.com/wangsun1983/Obotcha/blob/master/lang/include/Reflect.hpp 代码中主要的宏定义就是:DECLARE_REFLECT_FIELD#define DECLARE_REF...原创 2020-08-16 21:17:29 · 251 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(String大小写转换优化)
这几天在调试websocket的连接,用perf简单看了一下耗时,发现很大一部分是花费在了String转小写上面(主要原因是http的header我是规定用小写字母作为key存储的)。上网看了一下网上大侠们的推荐,没找到什么好的方案。只有一位大侠说通过简单的比特位操作可以将字母切换大小写,但是遇到标点符号基本就凉了。先上一个C++上通用的转换接口:std::transform(result->m_str.begin(),result->m_str.end(),result->...原创 2020-07-08 23:01:54 · 163 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(Perf调优)
这几天在调试ScheduledThreadPoolThread的大数据并发。测试的case很简单,代码如下: ScheduledExecutorService pool = st(Executors)::newScheduledThreadPool(); long time = st(System)::currentTimeMillis(); for(int i = 0; i < 32*1024;i++) { pool->schedule(crea..原创 2020-05-24 19:51:54 · 425 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(Http Multi Part)
之前几天写过一个http chunk传输的实现,这个主要是用来给服务器下发文件用的。今天介绍的HttpMultiPart主要是用来给客户端上传文件的。个人刚刚接触服务器,不了解是否还有其他方法上传文件,只找到MultiPart这个方法,所以就先实现这个功能再说。先来看一下MultiPart传输的格式://--------WebKitFormBoundaryrGKCBY7qhFd3Tr...原创 2020-02-25 22:17:28 · 431 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(如何重载operator [])
今天我在写代码的时候,发现Java一个很实际的功能,例如java定义一个数组:int mylist[] = new int[25];System.out.println("list size is " + mylist.length); 我们可以方便的读取list的长度,但是C++里面,你定义一个数据,实际上就是分配了一块内存,根本不能从数组上获取任何信息。每次遍历数组数据,...原创 2020-02-23 12:19:02 · 232 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(Http Chunk传输)
2019年年尾遇到点恶心事情,耽搁了一段时间。哈哈,人生感悟就是“仗义每多屠狗辈,负心多是读书人”。哈哈,闲话不说,记下来介绍一个Obotcha的Http Chunk传输的实现方法。 先来复制一段网上的介绍:在进行chunked编码传输时,在回复消息的头部有Transfer-Encoding: chunked编码使用若干个chunk组成,由一个标明长度为0的chun...原创 2020-02-08 12:20:36 · 452 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(WebSocket服务端)
今天主要介绍的websocket服务端的代码。说起websocket的协议,网上有很多很多很多。我这里推荐大家看一下webscoektpp的代码,websocketpp是一套用头文件组成的库,详细介绍如下:WebSocket++ is a header only C++ library that implements RFC6455 The WebSocket Protocol. ...原创 2019-11-27 21:26:46 · 195 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(Sqlite3 ORM设计——Table设计)
先show一下Obotcha中声明数据库Table的方法:DECLARE_SIMPLE_CLASS(Student) IMPLEMENTS(SqlRecord) { DECLARE_TABLE_2(Student,age,name); DECLARE_INT_DATA_MEMBER(Student,age); DECLARE_STRING_DATA_MEMBER(Stud...原创 2019-07-23 23:47:29 · 856 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(ArrayList类)
一提起动态数组,写过C++的同学可能马上会反应过来,std::vector可以实现相同的功能。的确,vector功能和动态数组基本类似。但是,操作起来就没有java的ArrayList来的方便。下面我们先看一下vector的数据移除处理:std::vector<int>::iterator iter=std::find(a.begin(),a.end(),3);a.er...原创 2019-07-18 23:50:14 · 172 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(String类)
编程里面涉及最多的就是字符串,整天对字符串进行比较,大小写切换等操作,真心比较烦心。当然要是习惯了使用std::string的话,实际上还是可以的。但是对比Java的String类,真心不得不说Java的还是比较方便的。所以Obotcha里面有一个类似Java String的类,就叫String。先看一下String的接口:_String(std::string *v); ...原创 2019-05-31 23:12:09 · 203 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(ByteArray类)
C/C++中分配内存主要使用的就是mallc和new,但是如果随意申请内存,就无法做到自动回收。所以在Obotcha中,使用了一个ByteArray的类来管理内存。申请一段内存可以使用直接调用createByteArray(int size)接口来获取。ByteArray构造函数内部处理如下:_ByteArray::_ByteArray(int length) { buff ...原创 2019-05-13 23:09:02 · 1860 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(Object类)
我们先从Obotcha最base的类Object开始介绍。 Object头文件位于lang/include/Object.hpp,同java相同,所有的类都是Object的子类。Object包含了以下几个函数 1.inline void incStrong(__attribute__((unused)) const void* id) //用于引用计数+1 2.inline ...原创 2019-04-26 23:00:55 · 538 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(Calendar类)
C++中关于日历的类我暂时没有找到,哈哈,网上只能找到这样的描述:“C++ 标准库没有提供所谓的日期类型。C++ 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 <ctime> 头文件。“所以操作日期在C++里面是比较烦人的。参看Java的Calendar类,它提供了各种操作类,详细可以参看:http://andr...原创 2019-08-02 22:54:53 · 365 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(Java代码翻译成C++代码实验)
今天在编写websocket的协议解析时突发奇想,是否可以将OKHTTP的处理直接用Obotcha来翻译呢?哈哈,下面是解析WebSocket协议头的代码:Java代码:private void readHeader() throws IOException { if (closed) throw new IOException("closed"); int b0 = ...原创 2019-07-26 23:35:07 · 307 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(Thread类)
今天开始就要开始Obotcha的Thread介绍了。其实多线程这个东东大家平时编程用的一定很多,linux C一般用pthread,C++一般用thread,说实话,为了多线程,我还看了一下《C++并发编程实战》,总的来说还是java的concurrent包提供的功能比较好用。哈哈,所以在Obotcha中专门有一个concurrent文件架来支持多线程。 开发Thread类,主要...原创 2019-08-09 22:23:12 · 240 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(StackTrace类)
编写Java代码的时候可以通过打印Throwable来看函数的调用关系。但是在C++里面没有相关的接口来实现。所以我们只用通过C接口backtrace/backtrace_symbols来实现相关功能。和网上的大多数介绍一下,如果需要backtrace_symbols解析出相关trace,需要添加编译选项:-rdynamic。在Obotcha中,有一个单独的Exception类的print...原创 2019-09-03 22:27:21 · 384 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(多线程调试)
这个礼拜大部分精力都花在了多线程的调试上。这里标记一下遇到的多线程bug和调试手段。1.PTHREAD_CANCEL_ASYNCHRONOUS和pthread_cleanup_push之前在Thread.cpp中,有如下代码:pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, nullptr);.....//一些处理pthread...原创 2019-09-20 23:23:23 · 464 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(Valgrind内存泄露调试二)
昨天发现了pthread_create的一个内存泄露问题,通过添加releaseThread来做了释放处理。今天复测发现仍然有问题:==14387== 304 bytes in 1 blocks are possibly lost in loss record 63 of 63==14387== at 0x4C31B25: calloc (in /usr/lib/valgri...原创 2019-09-30 23:19:57 · 479 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(Valgrind内存泄露调试三)
今天花了点时间调试了ByteArray和String之间的内存泄露。场景如下: 1.TcpServer获取数据以后,直接打包成ByteArray 2.使用ByteArray的时候在转换成String问题1: 结果Valgrind出现了下面的提示==21186== Invalid read of size 1==21186== at 0x4C32D04: st...原创 2019-10-01 23:00:25 · 339 阅读 · 0 评论 -
如何优雅的写C++代码 Obotcha介绍(概述)
我是一个Java/C程序员。搞了半年QT和服务器(spring boot),给我的感受有一下几点:=========================================================== 1.QT真好用,任何功能能找到相应的模块支持。但是有些模块的设计真心难用(例如它的tcp),只能自己重写一个。 2.SpringBoot真好用,卡卡几下就能写一个像模...原创 2019-04-14 22:58:49 · 874 阅读 · 0 评论