golang_channel
在 Go 语言(Golang)中,Channel 是一种强大的并发原语,用于在不同的 Goroutine 之间进行安全的通信和同步。它是 Go 语言并发模型(CSP,Communicating Sequential Processes)的核心组成部分之一,旨在通过消息传递实现并发,而不是通过共享内存来实现并发。以下是对 Channel 的详细讲解,包括其概念、用法、特性、以及一些高级用法和注意事项。 一、Channel 的基本概念 什么是 Channel? Channel 是一种类型安全的数据管道,允许 Goroutine 之间通过发送和接收数据进行通信。 Channel 可以看作是一个先进先出(FIFO)的队列,发送到 Channel 的数据会被接收端按顺序读取。 Channel 提供了同步机制,确保发送和接收操作在适当的时机发生,避免了显式的锁机制。 Channel 的核心特性 类型安全:Channel 是强类型的,只能传递特定类型的数据。例如,chan int 只能传递整数。 阻塞行为:发送和接收操作默认是阻塞的,发送者在接收者准备好之前会等待,接收者在有数据可接收...
move_only_function
在C++中,std::move_only_function 是C++23引入的标准库功能,用于表示仅支持移动语义的函数对象(callable object)。它是std::function的变种,但与std::function不同的是,std::move_only_function不要求存储的函数对象是可拷贝的,仅要求可移动,从而支持更广泛的用例,例如存储只支持移动语义的对象(如std::unique_ptr或lambda表达式中的非可拷贝对象)。以下是对std::move_only_function的详细说明,包括其设计、用法、实现规则和注意事项。 1. 什么是 std::move_only_function?std::move_only_function 是一个类模板,定义在 <functional> 头文件中,用于包装可调用对象(如函数指针、lambda表达式、仿函数等),并提供类型擦除(type erasure),使其可以存储不同类型的可调用对象,同时只要求这些对象支持移动构造和移动赋值,而不需要支持拷贝。它是C++23标准的一部分,旨在解决std::func...
cpp特殊函数生成规则
在C++中,特殊成员函数(special member functions)是指由编译器自动生成(或隐式声明)的类成员函数,包括默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数和移动赋值运算符。这些函数在特定情况下会由编译器自动提供,但其生成规则受到类定义和用户提供的声明的影响。以下是C++中特殊成员函数的生成规则的详细说明,基于C++11及以后的标准。 1. 特殊成员函数的种类C++中的特殊成员函数包括以下六种: 默认构造函数 (T::T();) 无参数的构造函数,用于创建对象。 析构函数 (T::~T();) 用于清理对象资源。 拷贝构造函数 (T::T(const T&);) 用于通过复制已有对象来构造新对象。 拷贝赋值运算符 (T& operator=(const T&);) 用于将一个对象的内容复制到另一个已有对象。 移动构造函数 (C++11 引入, T::T(T&&);) 用于通过移动已有对象的资源来构造新对象。 移动赋值运算符 (C++11 引入, T& operator=(...
Java21 新特性
Java 21 是继 Java 17 之后的又一个长期支持(LTS)版本,于 2023 年 9 月 19 日发布,相较于 Java 17 引入了许多新特性和改进,涵盖语言特性、性能优化、并发模型、API 增强等方面。以下是对 Java 21 相比 Java 17 的主要新特性的详细总结,重点突出其提升,并尽量简洁: 1. 语言特性改进 虚拟线程(Virtual Threads,JEP 444,Java 21 正式化) 项目 Loom 的核心成果,引入轻量级线程,极大降低并发编程的开销,适合高吞吐量应用(如 Web 服务)。 与 Java 17 的平台线程相比,虚拟线程无需直接绑定到 OS 线程,创建和管理成本低,可支持百万级并发。 示例: try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { IntStream.range(0, 10000).forEach(i -> executor.submit(() -> { Thread.sleep(1000...
Java17 新特性
Java 17 相对于 Java 8 的提升主要体现在语言特性、性能、API 增强、安全性以及生态系统的改进上。以下是详细对比,涵盖主要方面的提升: 1. 语言特性的改进Java 17 引入了多项新特性,许多是 Java 8 之后逐步引入并在 Java 17(长期支持版本,LTS)中稳定或正式化的功能: 密封类(Sealed Classes,JEP 409,Java 17 正式化) 允许限制类的继承,明确指定哪些子类可以继承某个类或接口,增强代码的可维护性和安全性。 示例: public sealed class Shape permits Circle, Rectangle, Triangle { ... } Java 8 无此功能,继承控制依赖开发者手动约束。 记录类(Records,JEP 395,Java 16 引入,Java 17 完善) 用于快速定义不可变数据类,减少样板代码(如 getters、equals、hashCode 等)。 示例: public record Point(int x, int y) {...
Java11 新特性
Java 11 是继 Java 8 之后的另一个长期支持(LTS)版本,于 2018 年 9 月 25 日发布,相对于 Java 8 引入了多项重要的语言特性、性能优化、API 改进和模块化支持。以下是对 Java 11 相比 Java 8 的主要新特性和提升的简洁总结,涵盖核心变化: 1. 语言特性改进 局部变量类型推断(var,JEP 323,Java 10 引入) 使用 var 关键字简化局部变量声明,编译器自动推断类型。 示例: var list = new ArrayList<String>(); *// 推断为 ArrayList<String>* var stream = list.stream(); *// 推断为 Stream<String>* Java 8 无此功能,需显式声明类型,代码较冗长。 Lambda 参数的局部变量语法(JEP 323,Java 11 扩展) 允许在 Lambda 表达式中使用 var。 (var x, var y) -> x + y Java 8 的 Lambda 表达式不支持 var,需显式指...
Java8 新特性
Java 8 的主要新特性,深入每个特性的背景、用法、实际应用场景,并提供代码示例,力求全面且易懂。Java 8(2014年3月发布)是 Java 语言的一次重大升级,引入了函数式编程、现代化 API 和性能优化,极大地提升了开发效率和代码可读性。以下是详细内容: 1. Lambda 表达式背景:Lambda 表达式是 Java 8 引入的函数式编程核心特性,旨在减少样板代码,允许将行为作为参数传递。之前,Java 处理匿名函数(如匿名内部类)时代码冗长,Lambda 简化了这一过程。 特性: 语法:(参数) -> 表达式 或 (参数) -> { 语句块; }。 无需显式声明参数类型(编译器可推断)。 可访问外部 final 或“有效 final”变量(即未被修改的变量)。 用于实现函数式接口(只有一个抽象方法的接口,如 Runnable, Comparator)。 代码示例: // 传统匿名内部类 Runnable r1 = new Runnable() { @Override public void r...
boost中好用的算法
基于 boost 1.82… timer 计时器过去老的 boost/timer.hpp 已经废弃了,目前推荐使用的是 boost/timer/timer.hpp, 主要包括下面了2个类 class detail boost::timer::cpu_timer 计时器 boost::timer::auto_cpu_timer 计时器,基于cpu_timer实现,在析构的时候输出耗时 struct cpu_times { nanosecond_type wall; // 挂钟时间 nanosecond_type user; // 用户时间 nanosecond_type system; // 系统时间 void clear() {wall = user = system = 0LL; } }; 默认的输出格式为下: “%w s wall, %u s user + %s s system = %t s CPU (%p%)\n” format meanin...
cpp中的rvo
c++11 以后支持了nrvo(命名的rvo),先来一张图 直接贴代码 #include <iostream> #include <string> #include <vector> using namespace std; class BigObject { public: BigObject() { cout << "Constructor\n"; } ~BigObject() { cout << "Destructor\n"; } BigObject(BigObject const&) { cout << "Copy Constructor\n"; } BigObject& operator=(BigObject const&) { cout << "Assignment Operator\n"; return *this; ...
cpp字符串
c++ string 的allocate和cowstring 可以说是c++ stl 中最常用的容器了,首先弄明白 cpp 中的string 到底是在哪里存储的,下面的代码我们重载了全局的new和delete #include <string> #include <iostream> #include <cstdlib> #include <vector> using namespace std; // 重载全局 new void* operator new(std::size_t size) { cout << "[Allocating " << size << " bytes]\n"; return malloc(size); } // 重载全局的 delete // void operator delete(void* ptr) noexcept { // cout << "[Deallocating]\n"; // return fre...