C++
文章平均质量分 81
ithiker
"All problems in computer science can be solved by another level of indirection."
展开
-
SWIG导出复杂C++模板代码
SWIG导出C++复杂模板代码原创 2024-03-04 22:18:36 · 522 阅读 · 0 评论 -
std::expected以及其开源实现
std::expected的介绍及开源实现介绍原创 2023-03-12 14:51:40 · 2166 阅读 · 2 评论 -
Vatti clipping 算法介绍
生成图形的LML根据LML的root vertex,生成一个Scan Beam List(SBL), SBL里面是按从小到大排好序的root vertex的Y坐标值从SBL中取出最小的Y值,找到和纵坐标值为Y的Scan line相交的所有活跃边(Active edges)处理找到的Active edges将每条Active edge的终点的Y坐标加入到SBL, 并将SBL维持在有序状态。原创 2022-11-06 22:12:34 · 3529 阅读 · 1 评论 -
Lua和C++中的浮点数的比较
在Lua 5.2以及以前的的版本中,所有的数值都采用double-precision floating-point来表示,也就是64位bit来表示整数或数,由表1,用来表示双精度浮点数的小数部分有52个bit, 根据问题4的结论,Lua的双精度浮点数可以连续准确表示的整数范围是。第三行的左侧由于会提升到浮点数,但是由于9007199254740993在浮点数中没有精确表示,只能近似表示为9007199254740992, 而右侧是整型,可以精确表示,所以第三行输出为。也是能被浮点数精确表示。原创 2022-10-31 23:54:58 · 735 阅读 · 0 评论 -
C++编译期循环获取变量类型
这里,通过AttributeType就可以得到float 类型{{通过std::tuple定义变量类型集合,通过typename std::tuple_element::type获取某个变量类型通过编译期递归实现编译期字符串比较通过std::get(attribute2type)获取属性编译期递归实现循环获取变量类型。原创 2022-09-08 15:39:32 · 1173 阅读 · 0 评论 -
GLIBC中的Symbol Versioning
由glibc编译得到的动态库是libc.so, glibc可以通过改变soname来发布新的版本,比如libc.so.6等等, 在实际中, 改变soname通常是大的发布, 如果需要一些小的改动,可以通过Symbol Versioning的方式实现.原创 2022-09-04 23:09:27 · 562 阅读 · 0 评论 -
Clipper2中的术语和基本概念
通过填充,可以表明哪些区域是位于Closed path的内部,哪些区域是位于Closed path的外部。给出了另外一个比较直观的方法:从图形的左边外部和需要计算winding number的子区域的一点,比如P所在的区域画一条线,最外部的winding number 是0, 当虚线延长到P点的过程中,如果图形由右至左穿过虚线那么,winding number加1,如果图形由左至右穿过虚线那么,winding number减1,这样任何一点的winding number就可以计算出来了。...原创 2022-08-31 16:32:44 · 4880 阅读 · 0 评论 -
GCC编译宏_GLIBCXX_USE_CXX11_ABI背景分析和实现原理
如果当前项目需要链接第三方库的API,比如第三方库编译时使用_GLIBCXX_USE_CXX11_ABI=0,当本项目编译时用的是_GLIBCXX_USE_CXX11_ABI=1,这个时候两个库ABI不兼容,应该报错;从上面1和2的分析,GCC5.1之后,要实现上面的功能,必须修改std::string和std::list的源代码,对于std::list, 它必须添加一个成员记录当前list的元素个数才能保证std::list时间复杂度为O(1)的要求。原创 2022-08-21 21:12:33 · 5590 阅读 · 0 评论 -
C++ std::list中size()的时间复杂度
通常情况下_GLIBCXX_USE_CXX11_ABI是非0的,也就是说C++11中size的时间复杂度是O(1),但当系统中需要混用不同版本的GCC编译的库时,必须将_GLIBCXX_USE_CXX11_ABI设置为0以保证ABI兼容,这种情况下size的时间复杂度是O(n)。可以发现,当_GLIBCXX_USE_CXX11_ABI=0时,size的时间复杂度是O(n),否则为O(1)。C98中size()的时间复杂度是O(N),C++11中正常配置下,是O(1),其它情况下是O(N)...原创 2022-08-02 15:55:33 · 1863 阅读 · 0 评论 -
std::minmax使用的注意事项
文章目录预备知识问题介绍问题分析问题解决解决方案1解决方案2预备知识C++11中新增加了一个函数,std::minmax, 它可以获取两个或者多个元素的最大最小值。相比之前我们先用std::max求处最大值,再用std::min求出最小值,它的优势是可以一次遍历获得最大最小值。问题介绍最近在项目中遇到了一个比较诡异的问题,就是一个unittest在开发中使用的debug build进行运行时,没有问题,但是在release build进行运行时就会挂掉。debug build默认使用的是-O0,原创 2021-12-13 09:34:28 · 1958 阅读 · 2 评论 -
std::enable_if与boost::enable_if,boost::enable_if_c的区别与联系
标准库与boost的这三个enable_if系列的函数可以帮助我们实现模板函数的重载。一般函数的重载先看一个一般函数重载的例子:#include <iostream>void print(int i){ std::cout << "Integral: " << i << std::endl;}void print(double f){ std::cout << "Floating point: " << f原创 2021-10-29 23:13:33 · 490 阅读 · 0 评论 -
解决用gcc7.3链接gtest1.7的问题
最近要在新系统中使用gcc7.3, 配套使用的gtest是1.7版本的,对于下面的程序:#include <gtest/gtest.h>TEST(testSuite, ShouldSucceed) {EXPECT_EQ(1, 1);}int main(int argc, char **argv) {::testing::InitGoogleTest(&argc, argv);采用下面的命令~/gcc/7.3.0_1/bin/g++ -std=c++11 -o g原创 2021-10-27 15:10:11 · 1423 阅读 · 0 评论 -
Linux上采用rdtsc指令对C/C++程序进行性能测试
RDTSC是什么RDTSC是 “Read Time-Stamp Counter”的缩写,它是目前intel和AMD的CPU都普遍支持的一条CPU指令,该指令可以把当前处理器的时间戳加载到EDX:EAX寄存器供外部使用。RDTSC的优点RDTSC是内置的CPU指令,而一般CPU单条指令运行也就需要几十个CPU cycles, 所以采用RDTSC指令可以在开销比较小的情况下获取程序的性能数据,可以说RDTSC是指令级别的性能测试利器。RDTSC的历史最初的RDTSC指令确实读取的是CPU自..原创 2021-08-29 17:30:39 · 4260 阅读 · 0 评论 -
C++11 Type-rich编程
文章目录背景问题预备知识类型(type)和单位(unit)带有单位的值初步解决方案解决方案完善重载运算操作符重载文字运算符(suffix literal operator)背景Bjarne在*Software Development for Infrastructure*中提到过一个因为参数类型不匹配导致重大损失的例子:1999年9月23日,NASA的Mars Climate Orbiter探测器由于导航问题消失在太空中,经济损失达6.5亿美元左右,问题的原因很简单,NASA开发的航天器的基础软件采用原创 2021-03-28 18:03:39 · 505 阅读 · 0 评论 -
在C++类的外部调用类的私有方法
文章目录引子问题技术准备1. pointers to member functions2. The explicit template instantiation3. Passing a member-function pointer as a non-type template parameter4. Passing a private pointer-to-member-function as a template parameter5. FriendPut the magic pieces toget原创 2021-02-20 16:22:08 · 4537 阅读 · 2 评论 -
在const和non-const functions间复用代码
文章目录const getter和non-const getterconst function和non-const function方案1方案2方案3方案4const getter和non-const getter在C++中,我们经常会用到const版本的getter和non-const的getter, const 版本不会修改成员对象,非const 版本用来进行修改,如下面来自Stackoverflow类似的代码:class Z{ // details};class X{原创 2021-02-19 19:27:32 · 277 阅读 · 0 评论 -
C++11中的NAN
C++11中引入了NAN, NAN是Not-A-Number的简写,表示不是一个数值,那么下面的代码:#include <cmath>#include <iostream>int main(int argc, const char *argv[]) { if (NAN == NAN) { std::cout << "NAN == NAN is true" << std::endl; } else { st原创 2021-02-19 15:00:40 · 2908 阅读 · 0 评论 -
SPrinter:一个基于Clang-Tidy的C++程序智能指针错误检查工具
最近项目中需要对C++智能指针做一些代码合入前检查,特别的,发现我们使用的Cppcheck, PCLint+都只支持对一般指针的检查,不支持智能指针,因此,在网上看到这个SPrinter, 发现它比较全面的支持了常见的智能指针错误检查,基于其论文,在这里智能指针错误类型及SPrinter工具的使用方法做一个简要介绍。...原创 2020-10-13 21:57:10 · 1225 阅读 · 1 评论 -
C++中的Covariant返回值类型
C++中当子类覆写(override)父类虚函数时,子类函数的返回值类型可以和父类函数的返回值类型不一致吗?先说结论:可以,但当且仅当它们的返回值类型是协变返回值类型(Covariant)时可以。C++中gcc从3.4开始支持这一特性。什么是协变返回值类型(Covariant)函数的协变返回值类型指的是子类中的成员函数的返回值类型不必严格等同与该函数所重写的父类中的函数的返回值类型,而可以是更 “狭窄” 的类型。C++/Java等面向对象编程语言均支持协变返回值类型。例子class Shape {原创 2020-10-11 21:27:19 · 403 阅读 · 0 评论 -
C++子类函数为什么不能重载父类函数
参考网页:https://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-derived-class-hide-other-overloads-of-thehttps://bastian.rieck.me/blog/posts/2016/name_hiding_cxx/原创 2020-09-24 10:24:37 · 1844 阅读 · 1 评论 -
代码圈复杂度(Cyclomatic Complexity,CC)和Oclint工具 介绍
什么是代码圈复杂度原创 2014-08-11 10:32:59 · 12325 阅读 · 0 评论 -
<<Effiective STL>>读书笔记
《Effective STL》原创 2014-11-30 09:17:52 · 1118 阅读 · 0 评论 -
《C和C++代码精粹》读书笔记
最近看了>, 设计到C++的指针,异常处理等方方面面,其中有些自认为非常不错的代码,在工作中非常值得借鉴。1.指向成员函数的指针A#includeusing namespace std;class C{ public: void f(){ cout<<"C::f\n";} void g(){cout<<"C::g\n";}};int main原创 2014-11-09 01:16:09 · 1601 阅读 · 0 评论 -
Google Glog Demo Code.
#include #include #includeusing namespace std;void ProcessSignal(const char* data, int size){ LOG(ERROR) << __func__ << ":Error..." << std::string(data,size);}int main(int argc, cha原创 2015-02-13 10:42:58 · 1375 阅读 · 0 评论 -
感兴趣的十款Google开源软件
浏览了下在OSChina上的Google开源软件列表, 摘选一些感兴趣的如下原创 2016-06-05 23:22:31 · 2997 阅读 · 0 评论 -
C++ 智能指针(shared_ptr/weak_ptr)源码分析
C++11目前已经引入了unique_ptr, shared_ptr, weak_ptr等智能指针以及相关的模板类enable_shared_from_this等。shared_ptr实现了C++中的RAII机制,它不仅仅具有一般指针(build-in/raw)的特性,更重要的是它可以自动管理用户在堆上创建的对象的生命周期,让用户不用为内存回收操心,避免内存泄漏。一般的智能指针都定义为一个模板类,...原创 2016-05-29 18:24:25 · 12643 阅读 · 4 评论 -
类模板以及其中的traits技术和type classification技术
1. 类模板相关概念类模板用来描述一系列具有相同行为的类。一般有如下的形式:template<class T, class U>class A{public: A(){ cout<<"Primary template\n";}private: T t; U u;};如上所示的类模板我们一般称之为主类模板。实例化后...原创 2017-07-31 14:22:39 · 695 阅读 · 0 评论 -
QT中的d-pointer模式分析
类中的数据有多种组织方式,通常存放在类本身中,有时,为了方便管理,也会将数据部分分离出来,放在另外一个结构体或类中。如下图所示:原创 2017-05-31 23:53:22 · 2693 阅读 · 0 评论 -
How to split a string in C++
Java has String.split(), Python has string.split(), Perl has split. There is no simple string-splitting method in C++, but there are plenty of ways of doing it. Here are some methods:Put it in a st...转载 2018-02-22 11:38:09 · 634 阅读 · 0 评论 -
C++ 11中的一些典型概念与分析
相比传统的C++98与C++03, C++11中新提出了很多新的概念,本文根据C++布道师Scott Meyers 在Youtube上的培训视频展开,介绍C++11中的一些典型概念,并进行分析。1. 左值(lvalue)与右值(rvalue)C++11之前已经有左值与右值的概念,但由于其只是简单的概念,并无太多应用,关注的不多;C++11中则贯穿了左值和右值的相关应用,比如类型推断等。判断左右...原创 2018-10-03 17:58:33 · 612 阅读 · 0 评论 -
Move Semantics and Perfect Forwarding in C++11
原文链接:Move Semantics and Perfect Forwarding in C++11翻译 2018-10-13 22:14:44 · 331 阅读 · 0 评论 -
C++对象计数
有时简单的事情看起来非常简单,但是他们却是非常微妙的。例如,你有一个Widget类,你想知道一共在运行时一共创建了多少个Widget对象。一个简单可行的方法是在Widget内部创建一个static counter,当对象创建时增加计数器的值,当对象销毁时减少计数器的值。同时,也要创建一个static类型的成员函数howMany,用来返回当前有多少个Widgets对象存在。如果Widget类只有简单...翻译 2019-01-26 12:25:33 · 4460 阅读 · 1 评论 -
Undefining the C++ Pre-processor(取消C++中的预处理器)
取消C++中的预处理器There are only two kinds of languages: the ones people complain about and the ones nobody uses (世界上只有两类编程语言:一类是被人们抱怨的,一类是没人使用的)— Bjarne Stroustrup我喜欢上面这句话。它能说明JavaScript and Haskell被人抱...翻译 2019-02-20 13:59:48 · 1398 阅读 · 0 评论 -
catch2:一个好用的C++单元测试框架
文章目录为什么需要catch简单易用命令行选项SectionsBDD-styleAssertion MacrosFloating point comparisonsExceptionsMatchersString matchersVector matchersFloating point matchersCustom matchers最近发现一个简单易用的C++开源测试开源库:Catch2(C+...原创 2019-02-24 23:17:08 · 23060 阅读 · 0 评论 -
Tutorial: When to Write Which Special Member(编写C++特殊成员的指导原则)
C++中的特殊成员,即编译器可能会自动生成的成员函数或操作符,即默认构造函数、析构函数、拷贝构造函数、移动构造函数,拷贝赋值操作符,移动赋值操作符当给人解释这些特殊成员的使用规则以及什么时候需要自己手动编写其中的某个时,人们总会提起下面的这幅图。但是,我不认为这个图是特别有用的。它覆盖了所有的组合,有些组合其实是不太合理的。在这篇文章中,我们主要介绍你实际应该知道的关于特殊成员的知识以及什么时...翻译 2019-03-21 22:15:45 · 409 阅读 · 0 评论 -
C++智能指针使用须知
我在《C++ 智能指针(shared_ptr/weak_ptr)源码分析》已经介绍了智能指针的一些使用注意点,本文在此基础上,基于C++11中的语法特性,介绍一些智能指针的使用须知。std::unique_ptr如果不需要共享,同时需要防止内存泄漏, std::unique_ptr是替代raw pointer(裸指针)的第一选择:它的大小和raw pointer一样,解引用的速度也和raw ...原创 2019-04-30 23:43:44 · 506 阅读 · 0 评论 -
标准C++中的string类的用法总结
相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用。但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯定的。也许有人会说,即使不用MFC框架,也可以想办法使用MFC中的API,具体的操作方法在本文最后给出操作方法。其实,可能很多人很可能会忽略掉标准C++中string类的使用。标准C++中提供的str转载 2014-08-06 11:11:16 · 709 阅读 · 0 评论