C++ new & delete
C++ 的 new 和 delete 是动态内存核心,但现代代码中应避免裸用。理解其机制避免陷阱:new 分配内存+构造对象,delete 析构+释放内存。 Widget 示例类(全局唯一定义) #include <print> #include <format> class Widget { public: Widget(int value) : value_(value) { std::println("Widget constructed with value: {}", value_); } ~Widget() { std::println("Widget destroyed"); } private: int value_; }; new 表达式 vs operator new 函数 new 表达式(语言操作符,不可重载):分配内存(调用 operator new)+构造对象,失败抛 std::bad_al...
C++ Stl Allocator
Allocator 是 C++ STL 容器内存管理的核心。它直接决定程序的内存效率和性能瓶颈。默认的 std::allocator 在高性能场景下往往不够用,但记住我的铁律:简单第一,复杂是敌人。 1. Allocator 的核心接口 STL 容器通过 allocator 抽象内存管理,解耦内存分配与容器逻辑。一个合格的 allocator 必须满足 allocator_traits 的要求: pointer allocate(size_t n): 分配 n 个元素内存,返回 pointer。 void deallocate(pointer p, size_t n): 释放内存。 rebind<U>::other: 用于类型转换。 重要:C++17 起,construct 和 destroy 成员函数已废弃。C++23 标准中已完全移除。使用 std::construct_at 和 std::destroy_at 代替。 // C++17+ 推荐方式 #include <memory> template <typename U, typename....
Rust Containers
Rust 的标准库提供了丰富的容器类型,每个容器都有其特定的使用场景和性能特征。理解这些容器的特性对于编写高效、安全的 Rust 代码至关重要。 Vec - 动态数组 Vec<T> 是最常用的容器,类似于 C++ 的 std::vector 或 Python 的 list。它在堆上分配连续内存,支持动态扩容。 基本用法 // 创建 let mut vec = Vec::new(); let vec2 = vec![1, 2, 3]; // 宏创建 let vec3: Vec<i32> = Vec::with_capacity(10); // 预分配容量 // 添加元素 vec.push(4); vec.extend(&[5, 6]); // 访问元素 let first = vec[0]; // 索引访问,越界会 panic let second = vec.get(1); // 安全访问,返回 Option<&T> // 修改元素 vec[0] = 10; // 删除元素 let last = v...
Cpp Timeline
C++: 从 C++11 到 C++23 的演进之路 C++ 从 2011 年开始进入了快速发展的时代,每三年一个新标准,带来了大量现代特性。本文将梳理 C++11 到 C++23 的主要特性和常用特性。 C++11 Core Feature Library Concurrency Move semanticsLambda expressionsauto and decltypenullptrHash Tableconstexproverride/finalUniform initializationrange-based forenum classstatic_assertVariadic templatesAlias templatesDelegating constructorsInheriting constructorsRvalue references Smart pointersstd::functionstd::bindstd::unordered_map/setstd::arraystd::tuplestd::forward_liststd::ch...
Java Containers
Java 容器:别只盯着接口,看实现 Java 的 java.util 集合框架(JCF)是每个 Java 程序员的必修课。但如果你只是机械地记忆 List、Set、Map,那你根本不懂容器。容器的本质是数据结构在内存中的组织方式。 1. 核心架构:从混乱到有序 Java 集合框架主要分为两大支系: Collection:存储单值元素。 Map:存储键值对(Key-Value)。 在 Java 21 之前,Java 的有序集合接口设计得一塌糊涂。你想访问第一个元素,List 用 get(0),Deque 用 getFirst(),而 SortedSet 却要用 first()。Java 21 引入了 Sequenced Collections,终于把这套烂摊子统一了。 SequencedCollection:提供了 addFirst、addLast、getFirst、getLast、reversed 等统一方法。 SequencedMap:同理,支持有序的键值对操作。 2. List:连续内存才是王道 ArrayList (默认首选) 本质:动态数组。 优势:CPU ...
Kubernetes 架构与底层实现详解
Kubernetes(K8s)是容器编排的行业标准。本文重点剖析其架构和核心组件底层实现原理。 为什么 Kubernetes? 声明式 API:定义期望状态,系统自动维护 强一致性存储:etcd + Raft 分布式调度与控制器模式 插件化:CRI/CNI/CSI 整体架构 核心概念概览 在深入Kubernetes架构之前,我们需要理解几个核心概念: 概念 定义 作用 Pod Kubernetes中最小可部署单元 包含一个或多个容器,共享网络和存储 Service 为Pod提供稳定网络访问的抽象 通过标签选择器动态发现后端Pod Deployment 声明式应用管理控制器 管理ReplicaSet,实现滚动更新和回滚 Namespace 逻辑隔离单元 将集群资源划分为多个虚拟集群 Node 集群中的工作节点 物理机或虚拟机,运行Pod Cluster 完整的Kubernetes环境 包含控制平面和多个工作节点 Pod详解: Pause容器:每个Pod都有一个根容器,负责共享网络命名空间 应用容器:实际运行业务逻辑的容器 共享资源:同一...
C++ namespace
C++ 命名空间(Namespace)详解 C++命名空间是语言的核心特性之一,用于解决名字冲突问题,尤其在大项目或使用多个库时。基于最新C++23标准,命名空间用法稳定,但结合模块(modules)使用更高效。下面直击要害,逐一拆解,包括[inline namespace]、匿名命名空间和命名空间别名。 参考:[cppreference.com] 1. 基本用法:声明与定义 命名空间通过namespace关键字声明,内容可以分散在多个文件中定义(如同函数定义)。 namespace MyLib { int add(int a, int b) { return a + b; } class Widget { public: void use(); }; } 使用方式: 限定名:MyLib::add(1, 2); 最安全,避免污染全局。 using声明:using MyLib::add; 只引入add,作用域内可用add(1,2)。 using指令:using ...
Java juc
JUC 是 java.util.concurrent 的缩写,它是 Java 标准库中一个至关重要的包,专门用于支持并发编程。从 Java 5 开始引入,JUC 极大地简化了多线程开发的复杂性,并提供了更强大、更灵活、更安全的并发工具。 可以毫不夸张地说,掌握 JUC 是从“会用多线程”到“精通并发编程”的必经之路。 一、 为什么需要 JUC ? 在 JUC 出现之前,我们主要依赖 synchronized、wait()、notify() 等关键字和方法来实现同步。但它们存在一些明显的缺点: 不够灵活:synchronized 是非公平锁,且无法中断一个正在等待获取锁的线程,也无法设置超时。 功能单一:它只是一个简单的互斥锁,无法实现更复杂的锁功能,如读写锁。 API 原始:wait()/notify() 的使用非常容易出错,比如忘记在 synchronized 块内调用,或者信号的丢失(notify 在 wait 之前执行)。 性能瓶颈:在 JDK 1.6 之前,synchronized 是重量级锁,性能较差。虽然之后有了锁升级等优化,但 JUC 中的 Lock 在某些场景下...
Java gc
Java 8 (2014年) 是一个里程碑式的版本,其 GC 组合(Parallel GC + CMS/G1)在当时非常经典。但从 Java 9 开始,GC 领域进入了快速迭代和创新的时期,核心目标是:降低停顿时间、提高吞吐量、更好地适应现代大内存和多核硬件,并简化 GC 的使用和调优。 一、核心思想转变:从“选择”到“自适应” 在 Java 8 之前,你需要根据应用场景(吞吐量优先还是低延迟优先)手动选择一个 GC,比如 -XX:+UseParallelGC 或 -XX:+UseConcMarkSweepGC 或 -XX:+UseG1GC。 从 Java 9 开始,一个重要的趋势是 “自适应”。JVM 变得更"聪明",它可以在运行时根据硬件配置和应用行为,动态地调整 GC 的行为,甚至在某些情况下,可以在不同的 GC 算法之间切换,以达到最佳性能。 二、G1 G1((Garbage-First) Garbage Collector (G1GC) - 持续进化,成为默认 G1 在 Java 7 引入,Java 9 中成为 默认的垃圾回收器。它是一个平衡型收集器...
C++ std::print
概述 C++23 引入了 std::print 和 std::println,这是现代 C++ 对格式化输出的重大改进。相比传统的 printf,这些新函数提供了类型安全、性能优异且易于使用的格式化输出方案。 基本用法 简单输出 #include <print> int main() { // 基本输出 std::print("Hello, World!\n"); // 带换行的输出 std::println("Hello, World!"); return 0; } 格式化输出 #include <print> #include <string> int main() { int age = 25; std::string name = "Alice"; // 格式化输出 std::print("Name: {}, Age: {}\n", name, age); // ...




