<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[leapmotion的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/leapmotion</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; leapmotion]]></copyright><item><title><![CDATA[一种非完全图下的TSP求解算法]]></title><link>https://blog.csdn.net/leapmotion/article/details/145580891</link><guid>https://blog.csdn.net/leapmotion/article/details/145580891</guid><author>leapmotion</author><pubDate>Tue, 11 Feb 2025 22:11:55 +0800</pubDate><description><![CDATA[本文提供了一种非连通图下的tsp的求解算法，比局部贪心好一点，但是也不是最优解。毕竟TSP问题是NP问题。]]></description><category></category></item><item><title><![CDATA[关于malloc/free的一些知识点]]></title><link>https://blog.csdn.net/leapmotion/article/details/142194099</link><guid>https://blog.csdn.net/leapmotion/article/details/142194099</guid><author>leapmotion</author><pubDate>Fri, 13 Sep 2024 07:55:17 +0800</pubDate><description><![CDATA[chunk被以下数据结构来组织，malloc_state也被称为是内存区，glibc实现的ptmalloc避免多线程并发引入主分配区和非主分配区，每个进程有一个主分配区，也可以允许有多个非主分配区。加锁失败就会继续找next的内存区，直到找到一个可用的内存区，都不可用，就会创建内存区。该环境变量可以用来开启内存错误检查，默认是关闭的，开启后，如果内存分配错误，会调用abort，比如调用free一个没有分配的内存，或者调用malloc一个超过内存限制的内存。下边判断是否是指定的so的内存，如果是就从。]]></description><category></category></item><item><title><![CDATA[linux0.11源码看read函数全流程]]></title><link>https://blog.csdn.net/leapmotion/article/details/140145242</link><guid>https://blog.csdn.net/leapmotion/article/details/140145242</guid><author>leapmotion</author><pubDate>Wed, 03 Jul 2024 10:21:45 +0800</pubDate><description><![CDATA[这篇文章带着大家去看linux0.11源码的read函数，大家每天都在读写文件，但是内部的具体流程还是很复杂的，还是从最简单的源码开始看起吧。会讲述一些内核的数据结构，函数调用流程，文件系统等等。linux0.11的文件系统是MINIZX文件系统，包含引导块、超级块、i-node位图、逻辑块位图、i节点与数据区等。如图所示：
这里比较重要的是i节点的数据结构：

如图所示，分为在内存使用和磁盘内存共用两个部分，当文件被加载或者打开或者进行操作时，会关联一些进程时间等信息，这些都是在内存部分操作，而实际和文件]]></description><category></category></item><item><title><![CDATA[cefpython3打包windows应用]]></title><link>https://blog.csdn.net/leapmotion/article/details/139321779</link><guid>https://blog.csdn.net/leapmotion/article/details/139321779</guid><author>leapmotion</author><pubDate>Thu, 30 May 2024 13:33:59 +0800</pubDate><description><![CDATA[最近使用cefpython3开发程序，网上找了一圈打包工具都没有效果，最后在github中翻到使用cx_Freeze进行打包。]]></description><category></category></item><item><title><![CDATA[从unique_ptr看函数调用约定]]></title><link>https://blog.csdn.net/leapmotion/article/details/138517731</link><guid>https://blog.csdn.net/leapmotion/article/details/138517731</guid><author>leapmotion</author><pubDate>Tue, 07 May 2024 07:39:13 +0800</pubDate><description><![CDATA[本文中其实是两个主题，一个是unique_ptr在参数传递和裸指针对比，unique_ptr使用内存传递，因为unique_ptr内部本身就是封装了指针，这就导致unique_ptr传递时会多一层。也是参考视频中提到的可能没有零成本的抽象吧。另外一个就是我们扩展了下其他类型的参数是走寄存器传递还是内存传递，也举例说明了下。不过这里省略了SIMD类型的参数。其中可能那里不对，请大家指出，共同进步。]]></description><category></category></item><item><title><![CDATA[从unique_ptr看空基类优化]]></title><link>https://blog.csdn.net/leapmotion/article/details/137654548</link><guid>https://blog.csdn.net/leapmotion/article/details/137654548</guid><author>leapmotion</author><pubDate>Thu, 11 Apr 2024 21:46:50 +0800</pubDate><description><![CDATA[本文通过从unique_ptr出发来看其在不同形式的删除器下的大小，从而得到unique_ptr中使用tuple来实现，进一步看tuple实现，得出对于其保存的数据来说，有成员存储和基类继承两种形式，而基类继承的形式如果是空基类的话又会对其进行优化。我们学习了unique_ptr的部分源码，tuple的部分源码，对于数据存储我们也学习到可以使用基类继承的形式。]]></description><category></category></item><item><title><![CDATA[C++的算法和KISS原则]]></title><link>https://blog.csdn.net/leapmotion/article/details/137130853</link><guid>https://blog.csdn.net/leapmotion/article/details/137130853</guid><author>leapmotion</author><pubDate>Fri, 29 Mar 2024 07:46:36 +0800</pubDate><description><![CDATA[优先使用算法的准则依然有效：无论什么时候，如果你看到了for循环，确认下是不是可以被算法替代或者ranges，然后这个准则更像一个指导方针：不要盲目跟随，而是要有意识地做出选择，选择那些更简单、更易读的方法，并注意其他替代方法，比如迭代器范围构造函数。]]></description><category></category></item><item><title><![CDATA[C++设计模式之访问者模式]]></title><link>https://blog.csdn.net/leapmotion/article/details/136862106</link><guid>https://blog.csdn.net/leapmotion/article/details/136862106</guid><author>leapmotion</author><pubDate>Wed, 20 Mar 2024 07:54:04 +0800</pubDate><description><![CDATA[访问者模式是可以将数据结构体和该结构体使用的算法分离的一种设计模式，属于行为型模式，在一些算法抽象情况下可能会用到。访问者模式可以做到在不修改一个类的情况下，向该类添加一些操作。当你在修改源码不太可能时，针对于类的操作，可以单独提供访问者类来实现。举例来说，比如说序列化每个类都知道如何序列化自己需要序列化到磁盘，缓冲区，socket等等目的地（destination）一个可选的方案是，写一个很大的函数，用来将目的地和类组合或者使用访问者模式，将类和序列化操作分离开。]]></description><category></category></item><item><title><![CDATA[constexpr与函数参数转发]]></title><link>https://blog.csdn.net/leapmotion/article/details/136296174</link><guid>https://blog.csdn.net/leapmotion/article/details/136296174</guid><author>leapmotion</author><pubDate>Mon, 26 Feb 2024 12:12:33 +0800</pubDate><description><![CDATA[本篇文章就是和大家探讨下constexpr的参数传递的问题，可以使用非类型模板参数，宏定义，lambda表达式做到。]]></description><category></category></item><item><title><![CDATA[linux0.11源码看信号的处理流程]]></title><link>https://blog.csdn.net/leapmotion/article/details/135835201</link><guid>https://blog.csdn.net/leapmotion/article/details/135835201</guid><author>leapmotion</author><pubDate>Thu, 25 Jan 2024 07:19:11 +0800</pubDate><description><![CDATA[本文我们从例子出发讲述了信号的处理整体流程，虽然内核的代码已经比较老了，但是总体的流程不变。我们从信号发射，信号捕获，信号处理等方面分析其流程。]]></description><category></category></item><item><title><![CDATA[C++用宏实现类成员反射]]></title><link>https://blog.csdn.net/leapmotion/article/details/135448181</link><guid>https://blog.csdn.net/leapmotion/article/details/135448181</guid><author>leapmotion</author><pubDate>Mon, 08 Jan 2024 07:08:14 +0800</pubDate><description><![CDATA[这里我们使用宏来实现了结构体（或类）成员的反射，包括成员的个数，成员的指针，成员的类型。有了这些我们就可以做一些基本的操作了，比如说一些序列化结构体等等。同时我们还展示了TypeList及相关的简单操作。当然你如果需要的话，也可以将TypeList操作丰富起来。]]></description><category></category></item><item><title><![CDATA[C++ 如何设计好用的API]]></title><link>https://blog.csdn.net/leapmotion/article/details/134845389</link><guid>https://blog.csdn.net/leapmotion/article/details/134845389</guid><author>leapmotion</author><pubDate>Wed, 13 Dec 2023 06:41:02 +0800</pubDate><description><![CDATA[好用的c++ api]]></description><category></category></item><item><title><![CDATA[C++现代模板元编程]]></title><link>https://blog.csdn.net/leapmotion/article/details/134636606</link><guid>https://blog.csdn.net/leapmotion/article/details/134636606</guid><author>leapmotion</author><pubDate>Tue, 05 Dec 2023 07:20:04 +0800</pubDate><description><![CDATA[现代模板元编程]]></description><category></category></item><item><title><![CDATA[诡异的bug之dlopen]]></title><link>https://blog.csdn.net/leapmotion/article/details/134411472</link><guid>https://blog.csdn.net/leapmotion/article/details/134411472</guid><author>leapmotion</author><pubDate>Wed, 15 Nov 2023 07:06:27 +0800</pubDate><description><![CDATA[本文我们从例子中看出来dlopen的解析符号的位置和顺序会影响程序的正确性。dlopen等函数不仅仅是依赖于运行时库还依赖操作系统，不同操作系统上表现可能不一样尽量不要多个不同的ELF文件含有相同的符号，比如这个例子中我们就可以让单独一个so库对factory及factory_register进行封装，大家都使用这个库保证符号的单一性。排查问题时可以使用readelf，nm，pmap等指令查看elf文件中的符号，以及运行时符号所在的位置等。]]></description><category></category></item><item><title><![CDATA[诡异的bug之cmake]]></title><link>https://blog.csdn.net/leapmotion/article/details/133811494</link><guid>https://blog.csdn.net/leapmotion/article/details/133811494</guid><author>leapmotion</author><pubDate>Tue, 17 Oct 2023 09:15:55 +0800</pubDate><description><![CDATA[本文展示了一下工作中遇到的bug以及bug整体的排查流程，和一些相关的手段，也是比较常用的，大家也可以记录到自己的小本本上。]]></description><category></category></item><item><title><![CDATA[探索一种C++中构造对象的方式]]></title><link>https://blog.csdn.net/leapmotion/article/details/133573115</link><guid>https://blog.csdn.net/leapmotion/article/details/133573115</guid><author>leapmotion</author><pubDate>Thu, 05 Oct 2023 07:18:36 +0800</pubDate><description><![CDATA[本文展示了一种对象构造的实现，使用AnyType的思路实现，中间也处理很多的问题。对于无需绑定（或部分绑定）构造函数参数的对象的构造，可扩展性及可维护性都有很好提升。当然该实现目前也尚不完备，目前只是类型绑定，也可以实现参数名字绑定等功能。上边论述的代码我放到了 https://github.com/leap-ticking/farrago 位置，欢迎取用。]]></description><category></category></item><item><title><![CDATA[如何通过模板和友元来骇客C++]]></title><link>https://blog.csdn.net/leapmotion/article/details/132388428</link><guid>https://blog.csdn.net/leapmotion/article/details/132388428</guid><author>leapmotion</author><pubDate>Sun, 20 Aug 2023 07:41:19 +0800</pubDate><description><![CDATA[友元和模板是C++中强大的工具，就像 C++ 中的其他工具一样，它们的行为会让我们大吃一惊。而当结合在一起时会变得令人困惑的行为。并不是说C++的这些方面很少见，而是它们再次证明了语言已经变得多么复杂。]]></description><category></category></item><item><title><![CDATA[C++与依赖注入]]></title><link>https://blog.csdn.net/leapmotion/article/details/131567418</link><guid>https://blog.csdn.net/leapmotion/article/details/131567418</guid><author>leapmotion</author><pubDate>Fri, 07 Jul 2023 07:32:53 +0800</pubDate><description><![CDATA[S 单一职责原则O 开闭原则L 里氏替换原则I 接口隔离原则D 依赖倒置原则那与我们相关的也是依赖倒置原则，描述为我们的class应该依赖接口和抽象类而不是具体的类和函数。那么依赖注入也是符合这个原则，简单理解来说就是当依赖的某个对象是通过外部来注入，而不是自己创建。依赖应该大家都是知道的吧，举个最简单的例子：这里我们就可以说Human这个类依赖于Tools，那么我们说的对于这个依赖项是从外部创建继而注入到这个类中。]]></description><category></category></item><item><title><![CDATA[linux下动态链接过程]]></title><link>https://blog.csdn.net/leapmotion/article/details/131040518</link><guid>https://blog.csdn.net/leapmotion/article/details/131040518</guid><author>leapmotion</author><pubDate>Sun, 11 Jun 2023 08:47:16 +0800</pubDate><description><![CDATA[elf文件动态链接]]></description><category></category></item><item><title><![CDATA[由libunifex来看Executor的任务构建]]></title><link>https://blog.csdn.net/leapmotion/article/details/130051507</link><guid>https://blog.csdn.net/leapmotion/article/details/130051507</guid><author>leapmotion</author><pubDate>Mon, 10 Apr 2023 07:55:29 +0800</pubDate><description><![CDATA[之前的一篇文章讲述了future的优缺点，以及future的组合性，其中也讲述了构建任务DAG一些问题，同时给出了比较好的方案则是Executor。Executor还未进入标准（C++23），Executor拥有惰性构建及良好的抽象模型来构建任务DAG，libunifex则给出了相当具有标准的实现，我们也借助libunifex的简短的代码来看下构建任务DAG的便利性。]]></description><category></category></item></channel></rss>