![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
#编程技巧
文章平均质量分 91
分享工作过程的面临的一些问题以及怎么去解决的
流星雨爱编程
记录工作的日常,心得体会
展开
-
浅谈通信协议设计
协议设计应尽可能简单,简单的协议更易于实现和维护,减少出错的可能性。复杂的协议往往会导致理解和实现的困难,增加维护成本。确保不同系统和硬件间的通信,协议应设计为能够在不同的系统和硬件之间进行通信,以实现广泛的互操作性。这有助于不同设备或系统之间的无缝集成。减少通信开销,协议应尽可能减少通信过程中的带宽使用、处理时间和电力消耗。这可以通过优化协议格式、减少冗余数据等方式实现。提供错误检测和恢复机制,协议应具备错误检测和恢复机制,以确保数据的正确传输。这包括校验码、重传机制等,以应对通信过程中的错误和丢包问题。原创 2024-09-01 20:26:07 · 1007 阅读 · 7 评论 -
深入分析网络编程中容易踩的坑
TCP是面向连接的可靠协议,TCP是流式协议,创建TCP套接字的类型为SOCK_STREAM很多同学面试时对书上的话背诵如流,在实际TCP编程中却没有处理粘包和分包的代码,以为TCP也和UDP一样,客户端每send一次,服务端就会recv一次,在本机上测试可能也没有出现问题,一旦到了线上发生粘包和分包的情况就会导致逻辑出错甚至程序崩溃。1) 发送端将每个包都封装成固定的长度,比如100字节大小。如果不足100字节可通过补0或空等进行填充到指定长度;2) 发送端在每个包的末尾使用固定的分隔符,例如\r\n。原创 2024-09-01 18:42:22 · 740 阅读 · 0 评论 -
C++类之间双向耦合规避的常见方法
C++中的双向耦合虽然在某些情况下是必要的,但它也可能带来诸多复杂性。通过合理设计类的依赖关系,使用接口、抽象类、依赖注入以及设计模式等技术,可以有效减少双向耦合对系统带来的负面影响。最终,理解双向耦合的本质,并在设计中有意识地避免不必要的耦合,创建出更加健壮、可维护和可扩展的代码,是提升代码质量和系统可维护性的关键。原创 2024-08-17 10:59:49 · 886 阅读 · 20 评论 -
C++惯用法:do...while(0)的妙用
在C++中,通常是用来做循环用的,然而我们做循环操作可能用for和while要多一些。经常看到一些开源代码会出现这样的代码,这样的代码看上去肯定不是用来做循环的,那为什么要这样用呢?下面就讲讲使用它的好处。原创 2024-07-14 12:25:29 · 1408 阅读 · 3 评论 -
C++惯用法: 通过std::decltype来SFINAE掉表达式
SFINAE 技术,即匹配失败不是错误,英文Substitution Failure Is Not An Error,其作用是当我们在进行模板特化的时候,会去选择那个正确的模板,避免失败。 SFINAE一般用于函数重载和编译期间类型检查,标准库中很多type traits模板就是通SFINAE来实现的。 看个具体的例子: 核心的代码是在实例化check_has_member_id对象的时候,通过模板参数T的类型,决定了结构体中对象value的值。而value的原创 2024-07-09 21:46:12 · 1337 阅读 · 9 评论 -
C++模块化之内部类
在C++中,内部类(Nested Class)是一种相对不太常用但却非常强大的编程工具。就是在一个类内部定义另外一个类,注意此时这个内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。 注意:内部类就是外部类的友元类。注意友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员,不管是public、protected、private。但是外部类不是内部类的友元。原创 2024-07-05 21:47:41 · 1096 阅读 · 0 评论 -
C++之assert惯用法
总之,assert是一种在开发过程中快速检测程序错误的有效工具,但在发布的产品代码中通常被禁用以避免性能影响。开发者可以根据需要使用assert或其他错误处理机制来确保程序的正确性和健壯性。原创 2024-06-11 21:00:58 · 1199 阅读 · 27 评论 -
C++ 的 Tag Dispatching(标签派发) 惯用法
总结来说,Tag Dispatching在C++中主要用于实现泛型算法的优化、迭代器类型的优化、类型属性的判断、编译时条件判断、模板元编程以及类型安全的接口设计等方面。通过使用Tag Dispatching技术,可以根据参数类型或特性在编译时选择最优的实现路径,从而提高代码的性能和可维护性。标签派发C++之多层 if-else-if 结构优化(二)C++17之std::invoke: 使用和原理探究(全)原创 2024-06-02 16:53:56 · 1342 阅读 · 3 评论 -
C++17的3个功能让代码变得更简洁
已经了解了结构化绑定如何允许单个声明声明一个或多个局部变量,这些变量可以具有不同的类型,并且其类型始终使用单个auto,它们可以从复合类型中分配。模板参数推导允许避免编写冗余的模板参数和辅助函数来推导它们。选择初始化使if和switch语句中的初始化与for语句一致,并避免了变量作用域过大的陷阱。原创 2024-05-15 11:52:46 · 972 阅读 · 9 评论 -
C++反射之检测struct或class是否实现指定函数
诸如Java, C#这些语言是设计的时候就有反射支持的。c++没有原生的反射支持。并且,c++提供给我们的运行时类型信息非常少,只是通过typeinfo提供了有限的一些支持。这一点点支持其实连类型名都无法打印好。更别说去检测一个结构体或类是否具有实现指定函数。通过编写模板代码和或requires(C++20)表达式,你可以根据某个类型是否拥有特定的成员函数或方法来启用或禁用某些代码。这种方法不会直接告诉你一个类型是否实现了某个函数,但它允许你根据类型的能力编写条件编译的代码。原创 2024-05-08 22:07:00 · 373 阅读 · 6 评论 -
C++实现自定义对象支持Range-based循环语法
自定义类支持range-base for需要满足的条件:1)类中需要定义容器相关的迭代器(这里的迭代器是广义的,指针也属于该范畴)2)类中要有begin()和end()的成员方法,返回值为迭代器(或重载全局的begin()和end()也可以)//返回第一个迭代子的位置//返回最后一个迭代子的下一个位置3)迭代器必须支持!=、*解引用、前置++等操作operator++(自增),可以在自增之后返回下一个迭代子的位置operator!= (判不等)operator* (解引用)原创 2024-05-08 11:33:04 · 808 阅读 · 5 评论 -
C++之内联(inline)
内联的优势其实可以分成两个部分,一个是调用方面的,比如前面说的出栈入栈等;另外一个是调用时的优化,比如函数代码如果成为内联函数,编译就可以把一些类似的固定计算直接指定为计算的结果值。而内联的劣势,主要就在于内联导致的代码膨胀,而有些时候过度内联反而会导致性能的丧失。明白了内联的优缺点,就可以根据自己的实际开发需求来进行使用了。整体上而言,内联函数适合于小型、高频函数的调用,通常可以在ORM的数据库属性读写中看到。原创 2024-05-05 18:57:03 · 939 阅读 · 2 评论 -
C/C++零长度数组的妙用
其实零长度数组是一个技巧,这样的小技巧在C/C++中有很多。它们在一些特定的场景下有着非常好的应用,不过前面的定语一定要记清楚,特定的场景。这也是C/C++让初学者感到难缠的一个重要原因。到处都有一些特殊情况,而特殊情况里可能又套着特殊情况。这种小技巧的东西,不用刻意学习,用到了,想起来有,查查资料用就可以了。原创 2024-05-05 11:44:00 · 650 阅读 · 3 评论 -
C++之写时复制(CopyOnWrite)
CopyOnWrite允许多个对象共享相同的数据,避免了不必要的数据复制。这对于大型数据结构或多个对象需要引用相同数据的情况下,可以节省大量的内存。对于很少修改数据的情况下,CopyOnWrite可以显著提高性能。由于读操作不需要加锁,多个线程可以同时访问共享数据,提高并发访问的效率。对于一些读多写少的数据,写入时复制的做法就很不错,例如配置、黑名单、物流地址等变化非常少的数据,这是一种无锁的实现。可以帮我们实现程序更高的并发。减少数据拷贝。原创 2024-04-22 23:20:41 · 1528 阅读 · 7 评论 -
如何编写可读性高的 C 代码?
C 语言所诞生的UNIX平台提倡这样一种设计哲学:尽量进行简单的设计,让使用者如同搭积木一样的将这些简单的工具连接成强大的,完整的应用。应该说,C 比较好的继承了这一点,C 语言非常简洁,非常强大,而由于 C 语言诞生的比较早,当时的面向对象的思想还不成熟,所以出现了大量的过程式的 C 应用,从而给人们一种 C 语言是面向过程的语言的错觉,其实 C 只是提供了一些简单,强大而通用的能力,至于你想将其搭成什么样的积木,则全靠你自己了。原创 2024-04-06 12:05:19 · 1032 阅读 · 14 评论 -
编程大牛坚持了 10 年的 10 个编程好习惯
之所以要写注释,是因为当你在写某个程序的时候,可能当下记得很清楚,这一段是什么机制、如何实现,但是当你写的程序越来越多,你会忘记当初为什么这样写,改动和交接也十分麻烦,对代码进行注释就可以有效避免这种情况。编写官方文档的人,也通常就是这些技术或者软件的开发者,他们是对这些东西最了解的人,所以编写的文档不仅质量非常高,通常内容也都是最新的。了解开源项目:许多优秀的软件项目都是开源的,通过阅读这些项目的源代码,你可以更深入地了解它们的工作原理、架构设计和实现细节。写一天代码,70%的时间都放到重构上都不过份。原创 2024-04-05 22:46:04 · 778 阅读 · 6 评论 -
C/C++中重载函数取地址的方法
上述代码[1],[2],[3]处都会出现编译错误,那是因为函数重载,多个函数名相同,找不到该用那个函数地址。这个时候解决办法就是人为指定用那个函数,那么人为指定用那个函数有哪些办法呢?原创 2024-03-29 15:06:41 · 1010 阅读 · 18 评论 -
C++惯用法之copy and swap
使用"Copy andSwap"惯用法的一个优点是它简化了异常安全的代码实现,同时保持了代码的清晰和可读性。然而,它也有一些缺点比如可能会增加一些不必要的复制操作,特别是在大型对象或资源密集型对象的上下文中。在这种情况下,可能需要考虑其他优化策略如移动语(move semantics)或完美转发(perfect forwarding)。原创 2024-03-05 15:25:40 · 1511 阅读 · 22 评论 -
C++惯用法之RAII思想: 资源管理
RAII原则为C++程序员提供了一种强大且优雅的资源管理方法。通过将资源的生命周期与对象的生命周期绑定在一起,RAII不仅简化了资源管理,还提高了代码的健壮性和可维护性。然而,为了充分利用RAII的优势,程序员需要仔细设计类的接口和实现,并考虑到资源所有权和资源转移的问题。原创 2024-03-05 07:32:20 · 1738 阅读 · 25 评论 -
C++惯用法之空基类优化
C++ 中每个对象的实例都可以通过取地址运算符获取其在内存布局中的开始位置,因此每个类对象至少需要占用一个字节的空间。空类是指不包含非静态数据成员的类,但是可以包含及静态成员。C++ 中空类的大小是 1 字节。结果是1,因为空类同样可以被实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以上述大小为1。原创 2024-02-29 07:39:58 · 991 阅读 · 14 评论 -
C++惯用法之CRTP(奇异递归模板模式)
优点:省去动态绑定、查询虚函数表带来的开销。通过CRTP,基类可以获得到派生类的类型,提供各种操作,比普通的继承更加灵活。但CRTP基类并不会单独使用,只是作为一个模板的功能。缺点:使用CRTP需要编写更多的模板代码,增加了代码的复杂度,对于不熟悉模板编程的开发者来说可能会带来一定的学习成本。原创 2024-02-24 19:29:36 · 2507 阅读 · 13 评论 -
C++之RTTI实现原理
C++的RTTI为程序员提供了在运行时获取类型信息的便利,但在某些情况下,特别是涉及性能要求高的应用中,开发者可能需要权衡使用默认RTTI机制的开销,并考虑是否需要自定义实现以满足特定需求。自定义实现RTTI可以提供更灵活和高效的类型信息管理方式。我们设计RTTI时,基本上是通过宏的方式载入一些虚函数或者类型来处理一个class,在运行时识别到具体类型,就可以通过static_cast来进行安全转换。原创 2024-02-05 21:49:04 · 1867 阅读 · 19 评论 -
如何写出高质量的函数?快来学习这些coding技巧
作为一个coder,设计出一个好的架构和写出一手高质量的代码,都是不可缺少的技能;在我理解,高质量的代码意味着代码具有比较强的扩展性、维护性,高内聚和低耦合和尽可能少的bug;函数是我们编码过程中使用频率比较高的不可缺少的步骤,如何写出高质量的函数?不仅要遵循编写函数的代码规范,而且还要遵循函数的一些设计技巧。原创 2024-01-18 10:46:56 · 1850 阅读 · 5 评论 -
从C++容器中获取存储数据的类型
需要从容器 t 中获取元素的类型,首先我们想到的是:TYPE temp;编译报错, 那是因为TYPE是int&,如果需要定义,就必须去掉引用,于是想到了, 它的作用是取出基本类型, 为类型T应用从左值到右值(lvalue-to-rvalue)、数组到指针(array-to-pointer)和函数到指针(function-to-pointer)的隐式转换。原创 2023-12-27 18:18:59 · 947 阅读 · 0 评论 -
C++之多层 if-else-if 结构优化(三)
if (是否海外用户) {if ( 刷单用户) {if (未付费用户 && 不再服务时段) {if (转介绍用户 || 付费用户 || 内推用户) {按照上述的条件我们可以得出的结论是:咱们的的主要流程主要是基于 and 或者 or 的关系。如果有一个不匹配的话,其实咱们后续的流程是不用执行的,就是需要具备一个短路的功能。对于目前的现状来说,我如果在原有的基础上来改,只要稍微注意一下解决需求不是很大的问题,但是说后面可维护性非常差。后面进过权衡过后,我还是决定将这个部分进行重构一下。原创 2023-12-22 11:07:48 · 739 阅读 · 0 评论 -
C++之多层 if-else-if 结构优化(二)
7.使用责任链模式进行结构优化8.利用模板元编程的萃取原理来优化9.利用策略模式+工厂模式来优化原创 2023-12-21 10:29:57 · 1002 阅读 · 1 评论 -
C++惯用法之Pimpl
Pimpl即“pointer to implementation”(指向实现的指针)。该技巧可以避免在头文件中暴露私有细节,是促进API接口和实现保持完全分离的重要机制, 从而减少编译依赖和提高编译速度。如下图为impl常见的内存布局,class A只提供公有接口func1, func2,其实现细节由Impl类实现,class A通过一格Impl 指针impl来提供服务。这样做的目的在于,使用class A公有接口的用户,不必关系其实现细节,而且实现的变动,对用户也是透明的。原创 2023-12-20 22:23:05 · 651 阅读 · 1 评论 -
C++之多层 if-else-if 结构优化(一)
在C++编程,多层嵌套的if-else-if结构可能会使代码复杂且晦涩难懂;多年的项目经验告诉我,在遇到多个条件判断,不同分支走向不同逻辑的时候,可以利用多种方法优化这种结构,使得代码结构更加的清晰,易于理解,下面就简单介绍一下这些方法。原创 2023-12-20 12:36:30 · 1245 阅读 · 1 评论