<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cxx on I'm OWenT</title><link>//owent.net/tags/cxx.html</link><description>Recent content in Cxx on I'm OWenT</description><generator>Hugo</generator><language>zh-cn</language><copyright>&lt;a rel="license" href="https://github.com/owent/blog-hugo/blob/master/LICENSE.md"&gt;&lt;img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/80x15.png" /&gt;&lt;/a&gt;</copyright><lastBuildDate>Tue, 08 Oct 2024 20:45:45 +0000</lastBuildDate><atom:link href="//owent.net/tags/cxx/index.xml" rel="self" type="application/rss+xml"/><item><title>实现strong_rc_ptr(比shared_ptr更快的引用计数智能指针)</title><link>//owent.net/2024/2405.html</link><pubDate>Tue, 08 Oct 2024 20:45:45 +0000</pubDate><guid>//owent.net/2024/2405.html</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;我们的新项目有个比较复杂的全区全服交易行系统，其中搜索和推荐是高实时性全区服多维度排序的，并且要支持比较复杂的标签交集查询和属性范围查询的自由组合。
当有订单发生变化时，它不仅仅会影响全服状态下搜索和推荐条件的结果变化，也会同时影响商品维度的聚合，交易行层面的数据聚合。&lt;/p&gt;</description></item><item><title>手夯一个STL allocator和对象内存分析组件</title><link>//owent.net/2024/2404.html</link><pubDate>Wed, 21 Aug 2024 23:51:45 +0000</pubDate><guid>//owent.net/2024/2404.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;我们项目组前段时间排查和分析压测环境下的某些业务模块大量索引结构的内存问题。通用的工具比如 &lt;a href="https://github.com/jemalloc/jemalloc"&gt;jemalloc+jeperf&lt;/a&gt; 或者 &lt;a href="https://github.com/google/tcmalloc"&gt;tcmalloc+gperf&lt;/a&gt; 的组合过于底层，一方面开启跟踪开销较高，另一方面也是会产生过多噪音数据影响判断。所以我针对我们的智能指针（包含 &lt;code&gt;std::shared_ptr&lt;/code&gt; 和我最近写了个非线程安全的版本的 &lt;code&gt;strong_rc_ptr&lt;/code&gt; ， 这个后面有空再分享）和STL容器实现了allocator来帮助动态的手动插桩来分析问题。
最终的效果是可以通过一键替换类型申明的Allocator来插入动态控制和插桩统计的能力，这里分享一下手夯标准STL allocator的一些实现细节，方便其他小伙伴如果需要做类似的实现来参考。&lt;/p&gt;</description></item><item><title>std::condition_variable 的信号丢失问题</title><link>//owent.net/2024/2403.html</link><pubDate>Fri, 02 Aug 2024 15:30:45 +0000</pubDate><guid>//owent.net/2024/2403.html</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;这篇分享拖更了好久了。问题起源于去年我们项目组接入 &lt;a href="https://github.com/open-telemetry/opentelemetry-cpp"&gt;opentelemetry-cpp&lt;/a&gt; 的时候，在进程优雅退出的时候偶现超时，虽然可以直接kill进程没啥影响但是退出不“优雅”的话总归会破坏发布流程，增加人工介入的成本。这里记录一下问题可能其他的组件有类似的用法也会有相似的问题。&lt;/p&gt;</description></item><item><title>踩坑一处（GCC）STL `std::async` 实现BUG导致的crash问题</title><link>//owent.net/2024/2402.html</link><pubDate>Sun, 21 Jul 2024 02:32:45 +0000</pubDate><guid>//owent.net/2024/2402.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;近期发现项目组使用新版本的 &lt;a href="https://github.com/open-telemetry/opentelemetry-cpp"&gt;opentelemetry-cpp&lt;/a&gt; 的时候偶现崩溃。崩溃的位置在STL的 &lt;code&gt;std::future&lt;/code&gt; 析构的地方，而这个 &lt;code&gt;std::future&lt;/code&gt; 由 &lt;code&gt;std::async&lt;/code&gt;创建。
比较违反直觉，这里记录分享一下分析和解决过程方面其他碰到的小伙伴们。&lt;/p&gt;</description></item><item><title>记录一些bazel适配用编译选项</title><link>//owent.net/2022/2202.html</link><pubDate>Mon, 14 Feb 2022 20:36:45 +0000</pubDate><guid>//owent.net/2022/2202.html</guid><description>&lt;p&gt;之前搞 &lt;a href="https://github.com/open-telemetry/opentelemetry-cpp"&gt;opentelemetry-cpp&lt;/a&gt; 的时候接触了下 &lt;a href="https://bazel.build/"&gt;bazel&lt;/a&gt; 构建系统。这玩意儿用起来有一点坑，特别是使用自定义编译环境的时候。&lt;/p&gt;
&lt;p&gt;在使用我自己编译的很新版本的 &lt;a href="https://github.com/owent-utils/bash-shell/tree/main/GCC%20Installer"&gt;GCC&lt;/a&gt; 和 &lt;a href="https://github.com/owent-utils/bash-shell/tree/main/LLVM%26Clang%20Installer"&gt;clang+libc++&lt;/a&gt; 的时候，涉及对libssp的检测和 &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; 环境变量在 &lt;a href="https://bazel.build/"&gt;bazel&lt;/a&gt; 中各个步骤中的传递，这里记录一下适配脚本。&lt;/p&gt;</description></item><item><title>测试现代化硬件C++浮点数性能和一致性</title><link>//owent.net/2022/2201.html</link><pubDate>Thu, 27 Jan 2022 11:39:45 +0000</pubDate><guid>//owent.net/2022/2201.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;很久很久以前，浮点数的性能和跨平台跨硬件架构一致性是无法获得保证的，所以我们一般在需要强一致性和高性能的游戏服务器中会禁用浮点数，转而使用自己实现的定点数。
这么多年过去了，前段时间想看看现代化硬件下是否仍然有性能问题和是否能够保证一致性，做了些简单的测试，这里记录一下。&lt;/p&gt;</description></item><item><title>[C++20] Module partitions和符号交叉引用（声明和实现分离）</title><link>//owent.net/2021/2103.html</link><pubDate>Thu, 25 Mar 2021 22:38:52 +0000</pubDate><guid>//owent.net/2021/2103.html</guid><description>&lt;p&gt;C++20 开始支持 &lt;strong&gt;Module&lt;/strong&gt; 了。在以前C++为了解决循环依赖问题，经常会把类或者函数声明写前面，实现写后面。然后中间的代码就可以实现内部模块的内聚而互相引用。比如:&lt;/p&gt;</description></item><item><title>libcopp接入C++20 Coroutine和一些过渡期的设计</title><link>//owent.net/2020/2004.html</link><pubDate>Fri, 22 May 2020 15:36:58 +0000</pubDate><guid>//owent.net/2020/2004.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;最近GCC 10.1.0 发布，三大编译器（MSVC、GCC、Clang）都已经支持了&lt;a href="https://en.cppreference.com/w/cpp/language/coroutines"&gt;C++20协程&lt;/a&gt;，之前给 &lt;a href="https://github.com/owent/libcopp/"&gt;libcopp&lt;/a&gt; 接入 &lt;a href="https://en.cppreference.com/w/cpp/language/coroutines"&gt;C++20协程&lt;/a&gt; 的计划也就提上了日程。&lt;a href="https://en.cppreference.com/w/cpp/language/coroutines"&gt;C++20协程&lt;/a&gt; 在创建、切换开销和内存分配上和传统有栈协程相比有着无可比拟的优势。但是C++20全面普及还有相当长一段时间，所以我们设计的重要目标之一就是能够让以后的迁移更容易且更平滑地进行，本文则是记录了 &lt;a href="https://github.com/owent/libcopp/"&gt;libcopp&lt;/a&gt; 接入 &lt;a href="https://en.cppreference.com/w/cpp/language/coroutines"&gt;C++20协程&lt;/a&gt; 时地一些性能上和平滑接入上的思考和成果。&lt;/p&gt;</description></item><item><title>跨平台协程库 - libcopp 简介</title><link>//owent.net/2019/1912.html</link><pubDate>Tue, 22 Oct 2019 21:53:00 +0000</pubDate><guid>//owent.net/2019/1912.html</guid><description>&lt;p&gt;前段时间有同事联系我想看看可能推广我之前写的协程库 &lt;a href="https://github.com/owent/libcopp"&gt;libcopp&lt;/a&gt;，虽然 &lt;a href="https://github.com/owent/libcopp"&gt;libcopp&lt;/a&gt; 已经用到过好几个项目上，这几年也断断续续地写了一些实现细节的文章，但是也但确实需要系统、概览性地介绍下 &lt;a href="https://github.com/owent/libcopp"&gt;libcopp&lt;/a&gt; ，所以就有了这篇文章。&lt;/p&gt;</description></item><item><title>C++20 Coroutine 性能测试 (附带和libcopp/libco/libgo/goroutine/linux ucontext对比)</title><link>//owent.net/2019/1911.html</link><pubDate>Sat, 05 Oct 2019 14:52:00 +0000</pubDate><guid>//owent.net/2019/1911.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;之前写了 &lt;a href="https://owent.net/2018/1806.html"&gt;《协程框架(libcopp)v2优化、自适应栈池和同类库的Benchmark对比》&lt;/a&gt; 和 &lt;a href="https://owent.net/2019/1904.html"&gt;《C++20 Coroutine》&lt;/a&gt; ，但是一直没写 &lt;a href="https://en.cppreference.com/w/cpp/language/coroutines"&gt;C++20 Coroutine&lt;/a&gt; 的测试报告。&lt;/p&gt;
&lt;p&gt;现在的草案版本比我当时写 &lt;a href="https://owent.net/2019/1904.html"&gt;《C++20 Coroutine》&lt;/a&gt; 的时候有了一点点更新，&lt;a href="https://en.cppreference.com/w/cpp/language/coroutines"&gt;cppreference&lt;/a&gt; 上有文档了(&lt;a href="https://en.cppreference.com/w/cpp/language/coroutines"&gt;https://en.cppreference.com/w/cpp/language/coroutines&lt;/a&gt;) 。里面列举的标准文档是&lt;a href="https://owent.net/2019/1904.html"&gt;P0912R5&lt;/a&gt;，这个文档目前还没完工，详情可以看他的来源&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4775.pdf"&gt;N4775&lt;/a&gt;。不过内容上暂时还没有太大的变化，今天我就照着之前的方式来benchmark一波 &lt;a href="https://en.cppreference.com/w/cpp/language/coroutines"&gt;C++20 Coroutine&lt;/a&gt; 吧。&lt;/p&gt;</description></item><item><title>C++20 Coroutine</title><link>//owent.net/2019/1904.html</link><pubDate>Mon, 04 Mar 2019 20:38:00 +0000</pubDate><guid>//owent.net/2019/1904.html</guid><description>&lt;h1 id="前言"&gt;前言&lt;/h1&gt;
&lt;p&gt;最近的新闻里 C++20 已经确认的内容里已经有了协程组件，之前都是粗略看过这个协程草案。最近抽时间更加系统性的看了下接入和实现细节。&lt;/p&gt;
&lt;p&gt;我的测试代码都是在MSVC下开启 &lt;code&gt;/await&lt;/code&gt; 选项后测试的，在我本地的Linux clang环境中，可以通过 &lt;code&gt;$LLVM_CLANG_PREFIX/bin/clang++ -std=c++2a -O0 -g -ggdb -stdlib=libc++ -fcoroutines-ts -lc++ -lc++abi -Wl,-rpath=$LLVM_CLANG_PREFIX/lib/ test.cpp&lt;/code&gt; 编译和运行。&lt;/p&gt;</description></item><item><title>2018年的新通用伪随机数算法(xoshiro / xoroshiro)的C++(head only)实现</title><link>//owent.net/2018/1810.html</link><pubDate>Thu, 18 Oct 2018 13:43:31 +0000</pubDate><guid>//owent.net/2018/1810.html</guid><description>&lt;p&gt;前段时间看到说&lt;a href="https://github.com/lua/lua/blob/f59e6a93c0ad38a27a420e51abf8f13d962446b5/lmathlib.c#L571"&gt;Lua 5.4&lt;/a&gt;用了一种新的通用随机数算法，替换掉本来内部使用的CRT的随机数引擎。我看了一下大致的实现，CPU和空间复杂度任然保持了一个较低的水平，并且循环节和说是随机性都还不错。我们游戏项目中原本对大量随机数场景的随机数算法使用的是基于线性同余的TAUS88，但是使用过程中发现这个算法分布上还是有一些不是很理想，所以就想把这个新的科研成果也用进我们项目中试试看效果。&lt;/p&gt;</description></item><item><title>可执行文件压缩</title><link>//owent.net/2018/1805.html</link><pubDate>Tue, 24 Apr 2018 10:58:05 +0000</pubDate><guid>//owent.net/2018/1805.html</guid><description>&lt;h1 id="前言"&gt;前言&lt;/h1&gt;
&lt;p&gt;最近看&lt;a href="https://rust-lang.org/"&gt;Rust&lt;/a&gt;相关东西的时候看到一篇关于压缩可执行文件的文章。压缩可执行文件对嵌入式开发特别有用，但是延伸一下用来减少我们游戏行业里预编译的工具二进制包大小和Android/iOS的库也是蛮有用的。&lt;/p&gt;
&lt;p&gt;原文见这里： &lt;a href="https://jamesmunns.com/blog/tinyrocket/"&gt;https://jamesmunns.com/blog/tinyrocket/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="基本流程"&gt;基本流程&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Release编译，移除调试符号文件，开启最小化size优化(-Oz)&lt;/li&gt;
&lt;li&gt;使用LLVM的全量LTO&lt;/li&gt;
&lt;li&gt;使用xargo重新编译标准库(std)和核心库(core)（这个C/C++不容易模仿，而且编译选项十分难搞）&lt;/li&gt;
&lt;li&gt;移除&lt;a href="https://github.com/jemalloc/jemalloc"&gt;jemalloc&lt;/a&gt;（服务器程序还是留着比较好，内置的malloc实现一般碎片比较厉害。虽然C/C++默认也不是&lt;a href="https://github.com/jemalloc/jemalloc"&gt;jemalloc&lt;/a&gt;，很多项目为了新能还是会用它）&lt;/li&gt;
&lt;li&gt;移除panic的详情信息（这个仅适用于&lt;a href="https://rust-lang.org/"&gt;Rust&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;strip（由GNU的&lt;a href="https://www.gnu.org/software/binutils/"&gt;binutils&lt;/a&gt;提供），参考命令: &lt;code&gt;strip [二进制]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://upx.github.io/"&gt;UPX&lt;/a&gt;进一步压缩加壳&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="尝试改造优化"&gt;尝试改造优化&lt;/h1&gt;
&lt;p&gt;然后尝试使用上面的流程改造我们的 &lt;strong&gt;gmtools-cli&lt;/strong&gt; 。原先我是直接开LTO+Release编译的，编出的文件大小为4.4MB（4520728字节）。&lt;/p&gt;</description></item><item><title>C++的backtrace</title><link>//owent.net/2018/1801.html</link><pubDate>Mon, 08 Jan 2018 17:55:00 +0000</pubDate><guid>//owent.net/2018/1801.html</guid><description>&lt;h1 id="开始之前"&gt;开始之前&lt;/h1&gt;
&lt;p&gt;很多语言的log模块都有一个功能，就是在打log的时候能够追溯调用栈，有的时候对查bug能有点帮助。之前我也想过给我们的log模块加上C++的backtrace的功能，迟迟一直没有做主要是两个原因：一是C++的backtrace在各个平台和编译器上都不太一样，比较冗杂；二是C/C++在编译优化之后，调用行之类的信息和甚至一些函数可能就被优化没了。所以能提供的信息就相当有限。前两天刚好有朋友问有没有提供这个，所以就花了点时间整理了下适配方案。&lt;/p&gt;</description></item></channel></rss>