- 博客(97)
- 资源 (3)
- 收藏
- 关注
原创 C++的STL_swap trick和现代C++的方法
我们都知道,std::vector的内存增长是随着元素的增加自动增加的,但是std::vector却没有相应的随着元素的减少自动释放内存的逻辑。因此,假设我们有下面的这样的类://…//这样写,m_data的内存是不会释放的,// 假设data占用了大量的内存,那么我们就达不到释放内存的目的在C99时代,如果要正确释放内存,我们需要这样写://…// 把一个临时的空的vector和m_data的内存交换,
2024-12-23 09:51:15
753
原创 C++源文件扩展名的历史和发展
C++ 源文件的扩展名反映了技术发展的历程和不同项目及组织的编码规范。从 C 语言的 .c 和 .h 到 C++ 早期的 .cc,再到最通用的 .cpp 和 .hpp,这些扩展名不仅帮助开发者区分不同的文件类型,还体现了 C++ 语言的演变和社区的多样化需求。无论选择哪种扩展名,都是C++代码承载容器的标识,见证了C++悠久的历史。
2024-12-23 09:47:03
721
原创 深入浅出 “ 领域驱动设计(Domain-Driven Design, DDD)”
领域驱动设计(DDD)的概念很多,理解难度很大,但是抽丝剥茧后,发现殊途同归。
2024-10-29 11:36:18
923
2
原创 软件架构设计艺术(从一个案例出发,成为优秀的软件架构师)
我们前面讨论了软件设计中的建模问题,回顾了软件工程中常见的架构设计思想,并探索了如何通过抽象来简化现实世界的复杂性,同时也体现了抽象过程中难以避免的局限性。通过具体的案例分析,我们揭示了在面对复杂业务需求时,如何选择合适的数据模型和架构策略来满足这些需求,同时也指出了在实际操作中会遇到的挑战和困难。最后引入架构设计的矛盾三角,解释问题本质。鼓励打开思路,避免教条主义,成长为真正优秀的架构师。
2024-10-29 10:37:07
688
原创 HTML(HyperText Markup Language)元素总结
HTML元素按功能分类可以帮助开发者更好地理解和使用这些元素。每种元素都有其特定的用途,合理地使用这些元素可以提高网页的可读性、可维护性和用户体验。通过掌握这些元素的功能和用法,可以构建结构良好、语义清晰的网页。
2024-10-12 14:32:39
913
原创 造轮子:手把手写一个高质量高性能的C++日志工具【精】
笔者很好奇如果用最新的C++技术实现一个精简强大的日志工具是什么体验,今天跟笔者一起展开这次编程冒险旅程吧!
2024-10-12 11:33:47
758
2
原创 动手测试:CPU的L1~L3级缓存和内存的读取速度测试
在许多文章中指出CPU的L1~3和内存的缓存的架构,速度差异等。纸上得来终觉浅,今天想实际写代码简单测试一下。
2024-09-30 16:12:02
2991
原创 深入解析《高效能人士的七个习惯》的内在关系和哲学思想
我们技术中心的所有管理者在Leader的推荐下全员人手一本《高效能人士的七个习惯》。当时只是对每个习惯进行分别的学习,没有更深入地思考他们之间的内在关系和更深入的哲学思想。今天总结梳理一番,觉得可以写一篇文章记录一下。
2024-09-29 17:03:05
980
原创 困扰我们的,不是如何过上更幸福的生活,而是如何过上比别人更幸福的生活
总之,在追求幸福的路上,我们要超越单纯意义上的物质积累和社会地位的竞争,转而寻求一种更加深层次的精神满足。通过调整我们的视角和态度,我们可以学会享受生活中每一个瞬间的美好,不再为无休止的比较所困。如此一来,不仅个人能够获得真正的幸福感受,整个社会也将因此变得更加和谐美好。只有当社会整体环境变得更加包容和支持时,个体才可能放下对外部评价体系的过度依赖,找到真正属于自己的幸福之路。
2024-09-29 11:43:05
486
原创 编程语言历史:聊聊Java最失败的设计:“==”
通过观察JVM上的其他语言对“”操作符的改进,我们可以看到,许多现代语言倾向于让“”默认比较对象的内容,而不是引用。这样的设计更加符合开发者的直觉,减少了因误解“==”操作符而引入的bug。同时,这些语言也提供了额外的方法来比较对象的引用,使得开发者可以在需要的时候进行精确控制。总结来说,“==”操作符的设计在Java中确实存在不合理之处。因此,在学习和使用Java时,深刻理解其设计的缘由和缺陷,可以有效地帮助我们在实践中规避许多问题,解答许多疑惑,进而更好地掌握Java并写出更加健壮和易于维护的代码。
2024-09-29 11:13:29
1116
原创 C++:你知道POD类型(Plain Old Data)吗?
C++11标准引入了两个新的概念,分别是标准布局类型(Standard-layout)和平凡类型(Trivial)。其中,标准布局类型主要关注对象在内存中的布局,而平凡类型关注对象的生命周期,包括它的构造、拷贝、移动和析构。C++11以及之后的标准中,POD类型是同时满足标准布局和平凡类型的类型。
2024-09-27 18:02:31
793
原创 Web技术学习:CSS属性结构化记忆梳理
CSS属性是一系列规则,用于描述HTML元素在网页上的外观表现。这些属性可以控制文本的颜色、大小、字体、背景颜色等,也可以控制元素的位置布局,甚至动画效果。文本与字体颜色与背景边框与填充布局与定位过渡与动画用户交互与元素属性属性数量多,分类特征不明显。设计上不够完美,存在明显的兼容和历史发展的痕迹。很多特性已经淘汰或者很少使用。初学者难以分辨。属性特性存在冗余和相互影响,提高了调试和理解的难度。属性在实际应用时难以抉择,存在多种方案,初学者很难找到最佳实践。
2024-09-27 15:49:05
1337
原创 小牢骚:总有人通过放大问题来制造麻烦
笔者的技术生涯中,经常会遇到这样的情况:一些技术负责人喜欢把问题放大,然后提出一个看起来考虑周到但实际上性价比低、复杂难用的方案。或者遇到一个小问题,就开始想制定一个规范,写一个几十页的技术指引,希望能彻底规避类似的问题。今天,闲聊一下这种行为模式背后有其深层次的原因,并且会对组织产生一定的负面影响。
2024-09-26 11:55:18
842
原创 二十个编程语言发展的“拦路虎”
Node.js生态系统中的npm工具就是一个典型例子,它不仅帮助开发者轻松安装和更新依赖库,还通过锁定具体版本来避免版本冲突问题,从而促进了社区内的资源共享和协作。Rust语言通过其独特的所有权体系(Ownership System),包括借用检查器(borrow checker),确保了在编译阶段就发现潜在的内存安全问题,如数据竞争和野指针。Lisp中的宏扩展器允许开发者定义自己的语法结构,而Rust中的宏规则则提供了一种安全的元编程方式,既保持了语言的简洁性又增强了表达力。Common Lisp中的。
2024-09-25 17:45:06
690
原创 认知决定命运:从狭隘到开阔的心路历程
个人的认知水平决定了我们的人生轨迹。通过不断学习和成长,我们可以拓宽视野,变得更加成熟和智慧。在这个过程中,我们应该学会洞察人性、远离负能量、勇于尝试、持续努力,并且始终保持自我负责的态度。只有这样,我们才能在人生的旅途中不断前进,实现自我价值。
2024-09-25 17:41:13
236
原创 什么是CAP定理
在分布式环境中,数据通常不是集中存储在一个位置,而是分散在网络中的各个节点上。这种分散性带来了灵活性和可扩展性,同时也带来了新的挑战,特别是在数据的一致性、可用性和分区容错性方面。本文旨介绍CAP定理的基本概念及其对开发工作的影响。
2024-09-24 14:35:37
715
原创 用最新的C++技术,如何实现一个序列化工具库?
随着C++标准的不断进化,实现简洁又实用的序列化工具变得越来越简单。目前我们还无法完全实现对结构体无侵入地实现反射,但是未来即将可以轻松实现。
2024-09-24 14:31:06
930
原创 什么是反应式编程模式?
在反应式编程中,我们通常不需要关心事件发生的具体时机,也不需要编写具体的循环或条件语句来处理这些事件。相反,我们只需要声明性地定义信号之间的依赖关系即可。这意味着我们可以简单地声明“当某个事件发生时,执行特定的操作”,而具体的实现细节则由反应式编程框架来处理。反应式编程的关键在于将数据流视为事件或信号,并使用声明式的方式来定义这些信号之间的依赖关系。这种方法使得程序更加简洁、易于维护,并且能够更好地处理异步和并发的情况。
2024-09-23 17:45:59
513
原创 了解函数式编程:从表象到本质,从技法到心法
一旦你尝试不用赋值语句编程,函数式编程的所有其他特性就水到渠成了。你要处理函数,就必须用递归,所有这些东西在你决定不用赋值的那一刻,就自然而然地形成了。所以说,函数式编程就是这么回事。
2024-09-23 17:43:27
941
原创 常见的深度学习模型总结
机器学习:指的是让计算机能够通过经验自动“学习”如何完成任务的一系列算法和技术。机器学习模型可以从数据中学习规律并做出预测或决策,而无需明确编程。深度学习:是机器学习的一个子集,它专注于使用多层神经网络(即深度神经网络)来模拟人脑处理信息的方式,从而解决复杂的学习任务。
2024-08-30 14:41:18
2221
原创 透过编程世界中无处不在的 “树”,寻找编程的本质
树结构在编程世界中的普遍应用和深远影响,反映了编程本质上对问题的抽象、分解和组织能力的追求。它不仅仅是一种数据结构,更是一种解决问题的方法论,一种深刻的编程哲学体现。
2024-08-09 18:03:50
921
原创 漫谈Linux操作系统的发行版与软件生态
Linux操作系统以其开源、灵活和安全的特质,在全球范围内拥有庞大的用户基础。它在服务器、云计算领域、桌面系统、嵌入式设备和移动平台中广泛存在。Linux的多样性主要体现在其众多的发行版(Distributions,简称Distros)上。这些发行版基于Linux内核,但在用户界面、预装软件、包管理系统和定位上存在差异。了解这些发行版之间的关系以及它们的软件生态对于开发者发布程序至关重要。
2024-08-08 17:55:21
855
原创 32位程序 是如何运行在 64位Windows 系统上的?
加粗样式WOW64是让32位应用程序能够在64位Windows操作系统上无缝运行的关键。它利用CPU的模式切换能力,通过系统调用转换、文件系统和注册表重定向以及其他技术手段来实现这一目标。过程中存在一些性能损耗,但在大多数情况下,这种损耗对用户体验的影响不大。例如我们常用的许多软件(如QQ、WPS等)都依然是32位软件,而在使用过程中几乎感觉不到性能的变化。长远来看,随着越来越多的应用程序原生支持64位,WOW64的依赖将逐渐减少,直到32位应用程序最终淡出市场。
2024-08-08 17:30:08
3444
原创 命途多舛的Concepts:从提出到剔除再到延期最后到纳入,Concepts为什么在C++中大起大落?
在深入讨论Concepts的历程之前,我们首先需要明确概念本身。C++的Concepts在C++20标准中正式成为语言的一部分,它们为模板编程引入了一种类型约束系统。Concepts的核心目标是提高模板代码的可读性、可用性,同时让编译器能够提供更准确的错误信息,简化模板元编程的复杂性。C++的Concepts代表了语言演进的一种动态平衡。在追求技术卓越的同时,C++社区也在不断地反思和调整,以确保新特性的引入既能够带来实际的好处,也不会过度地增加语言的复杂性。
2024-08-01 11:48:20
983
原创 编程语言发展历史:赋值与相等运算符的变迁历程
首先让“:=”具有声明变量的语义,Python 3.8引入赋值表达式运算符(又被形象地称为海象运算符)“:=”,支持将表达式的值赋值给尚不存在的变量,并返回变量值(Python的“=”运算符不返回表达式的值),Go语言也将声明并赋值运算符定为“:=”。这些设计让“=”和“:=”在同一个语言中同时具有赋值的语义,而“:=”更进一步还具有声明变量的额外语义,简化了支持类型推导语言声明变量的代码形式,提高了语言的表现力。PL/I 语言的比较和赋值都是“=”,其具体的含义也取决于运算符的上下文。
2024-07-30 16:13:54
407
原创 公司培训:思维方式的进化:从“我认为”到“我证明”
我们希望引导大家将沟通思路从观点导向转变为事实导向,当我们不再满足于“我觉得”,转而追求“我证明”时,个人的认知边界将被拓宽,解决问题的能力也将大幅提升。在这个过程中,理性不是冰冷的教条,而是照亮前路的明灯,引导我们走向更加清晰、更加真实的世界。我们鼓励情感的表达,但同样强调,任何观点都应在理性的框架内展开,以事实为依据,以逻辑为引导,这样才能促进有效沟通,共同寻找问题的答案。例如,“这部电影非常感人”、“C++是最好的编程语言”都是观点,因为不同的人可能有不同的感受和偏好。“定义-量化-推导-证明”,
2024-07-30 16:01:18
504
原创 从《代码的艺术》中寻求“好代码”的要素
写出优质的代码,我们更需要更加关注:鲁棒(Solid and Robust)、高效(Fast)、简洁(Maintainable and Simple)、简短(Small)这四方面的要素,这四方面要素放在最前面,除了彰显其重要性外,更需要长期坚持和努力才能达到。加深对这些理念的理解,并运用于日常开发活动不断实践和感悟,必能看到更多的“好代码”在软件实践中绽放光彩,共同推动项目向着更高的技术标准迈进。《代码的艺术》是一本深入探讨软件开发哲学与实践的书籍,其中深入地讨论了 “好代码” 的特点。
2024-07-26 10:18:05
302
原创 C++实用指南:Lambda 表达式的妙用
Lambda 可以与算法结合使用,以实现自定义的迭代行为。});Lambda 表达式由于其匿名和内联特性,对于创建简洁、灵活的代码非常有用,它们已经成为现代C++编程中不可或缺的工具。
2024-07-25 18:17:01
581
原创 Chromium源码阅读(12):Chromium不支持MSVC的原因:Double4类型的SIMD封装
由于这些扩展不是标准 C++ 的一部分,因此文件中的代码依赖于支持这些扩展的编译器,GCC 或 Clang。对于逻辑操作,例如比较和逻辑与操作,注释建议使用 AllTrue 函数来检查所有分量是否满足条件,并且在做逻辑与操作时使用位与操作符 & 而不是逻辑与操作符 && 以减少分支。最后,注释指出使用的是 GCC 扩展(也被 Clang 支持),而不是 Clang 独有的扩展,以确保代码能够在 GCC 或 Clang 编译器上编译。字节大小的向量类型。组成的 SIMD 类型,用于存储逻辑操作的结果。
2024-07-25 15:50:05
364
原创 公司培训总结:拒绝倦怠,探索工作中的自驱力
找回和激发工作中的自驱力是一个持续的过程,它要求我们深刻地理解自己的内在动机,学会适应不断变化的环境,并采取积极的措施来维持我们的动力。通过澄清我们的价值观、调整我们的认知、设定明确的目标,并以长期的眼光来看待工作,我们可以在职业生涯中走得更远,实现自己的潜能,为社会做出更大的贡献。
2024-07-24 18:22:09
846
原创 在C++里如何释放内存的时候不调用对象的析构函数?
这个面试题既有趣也有深度,它提供了一个探讨C++语言内存和资源管理机制的机会,同时考察面试者对C++底层细节的了解程度。然而,在实际的软件开发中,绝大多数情况下都应该遵循RAII原则,让析构函数自动管理资源的释放。
2024-07-24 11:56:05
1616
原创 闲聊C++的RTTI
即使如此,dynamic_cast在跨模块场景支持度差、转换失败可能抛异常的惊人设计,以及其一些隐形规则容易翻车,大部分团队中不会进行广泛推广,而性能最多算个次要因素。不少人说,C++的RTTI(Runtime Type Information)的性能不行,或者dynamic_cast的性能不行。在技术上,我们要多问为什么,敢于挑战权威,深入思考问题的根本,切记不可人云亦云,滥竽充数。事实上,C++的RTTI的性能可以满足几乎一切的应用开发场景,但是C++的RTTI存在比较严重的设计缺陷。
2024-07-23 17:31:21
340
原创 从历史上最昂贵的空指针崩溃,论指针判空的重要性
2024年7月18日,美国信息安全巨头CrowdStrike推送的软件更新存在严重错误,导致全球范围内大量使用其软件的Windows电脑集体陷入“蓝屏”状态,无法正常使用。这场波及多个行业的“蓝屏”事件,不仅使多国航空、铁路、银行等基础设施服务中断,例如,特斯拉工厂生产因此暂停,马斯克称其为“史上最大IT失败”(Biggest IT fail ever),以此为导火索,特斯拉市值下跌了319.87亿美元。这次蓝屏的罪魁祸首,就是指针未判空导致的。
2024-07-22 15:06:34
723
原创 Chromium源码阅读(11):了解chromium base的raw-ptr
chromium base的rawptr.h引起了我的注意,常见的ptr封装有refed_ptr、weak_ptr等。raw_ptr还要封装吗?那一定是有特殊的意义。
2024-07-19 17:13:58
1320
原创 Chromium源码阅读(10):了解Log模块
Chromium许多日志被TraceEvent代替了,因此TraceEvent出现的频率要比Log高很多。但是也有不少场景使用Log。在blink,Log的实现由base提供,而blink/render/core/base/logging.h进行了二次封装。
2024-07-18 18:19:27
1459
原创 编程随笔:控制复杂度是计算机编程的本质。
过度的技术追求可能会引入额外的复杂性,而这种复杂性并不总是必要的。事实上,一个过于复杂的系统不仅难以构建和维护,而且很难适应变化,这与敏捷和响应性的软件开发实践背道而驰。作为开发者,我们应该培养出在复杂性和简洁性之间平衡的直觉,并将其作为我们编程实践中的指导原则。通过控制复杂度,提高软件的质量和可维护性,提升自身的工作效率和团队的协作能力。他在编程社区具有深远的影响力。这并不是说我们应该避免使用先进的技术或者强大的工具,而是说我们在选择它们时,应该更有目的性,更注重它们是否真正适合我们的需求。
2024-07-16 11:25:16
312
1
原创 C++宏魔法:__VA_OPT__操作
_VA_OPT__被设计用于处理可变参数宏(variadic macros)中的逗号插入或移除问题。这个宏是在C++20标准中引入的,用于解决在可变参数宏中逗号操作的不确定性,特别是在需要条件性地添加或去除逗号的情况下。在C++中,可变参数宏允许宏接受不定数量的参数。它们由_VA_ARGS_标识符标识,代表了宏调用中传递的所有额外参数。
2024-07-15 11:32:00
1560
原创 Chromium源码阅读(8):了解Base库里的PartitionAlloc模块
malloc符号定义这个阶段负责覆盖mallocfree等符号,并将这些调用路由到分配器shim内部。这由中的头文件处理。在Windows上:Windows的UCRT(通用C运行时)导出了弱符号,我们可以在中覆盖它们。在Linux/CrOS上:分配器符号作为导出的全局符号在(对于mallocfree等)和(对于等)中定义。这使malloc符号在主可执行文件和任何第三方库中得到适当的拦截。在Android上:与Linux/CrOS的情况不同,加载时的符号拦截是不可能的。
2024-07-15 10:56:56
1517
原创 初步探究Rust生态与图形界面编程
今天,我们一起探讨Rust图形界面编程的现状、生态系统的发展,以及面临的挑战。与C++的Qt、C#的WPF或者JavaScript的Electron等成熟的图形界面框架相比,Rust的图形界面生态显得相对年轻。布局是在安全的 Rust 中自定义实现的,并支持双向文本。Rust的快速增长也带动了其社区的发展,从各种在线论坛、聊天室到官方和非官方文档,都可以找到关于Rust图形界面编程的讨论和帮助。Rust在图形界面编程领域虽然起步较晚,但其安全性、性能和现代化的语言特性,为其未来的发展提供了坚实的基础。
2024-07-12 14:20:04
1603
6
windows核心编程
2011-08-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人