Zig 基础语法详解
Zig 是一门现代化的系统级编程语言,由 Andrew Kelley 创建。它的设计理念强调显式优于隐式、编译时代码执行、零成本抽象以及与 C 语言的完美互操作性。本文将全面介绍 Zig 的基础语法。 1. 变量与常量 1.1 变量声明 Zig 使用 var 声明可变变量,使用 const 声明常量: const std = @import("std"); pub fn main() void { // 可变变量 var x: i32 = 10; x = 20; // 可以修改 // 常量 const y: i32 = 30; // y = 40; // 错误:不能修改常量 // 类型推断 var z = 50; // 自动推断为 comptime_int } 1.2 基本数据类型 Zig 提供了丰富的整数和浮点类型: // 有符号整数 const a: i8 = -128; // 8位 const b: i16 = 1000; // 16位 const c: i3...
C++ Alignment
内存对齐不是什么花里胡哨的理论玩意儿,它是硬件决定的铁律。忽略它,你的代码要么崩溃,要么性能烂到家。现代C++给了你工具,让你精确控制对齐,而不是祈祷编译器聪明。 1. 为什么对齐重要? 硬件要求:CPU从内存读取数据必须按特定边界(如4字节、8字节、16字节)。不对齐,访问非法,段错误伺候。 性能杀手:不对齐导致多次内存访问、缓存失效。SIMD指令(SSE/AVX)强制16/32字节对齐,否则零矢量惩罚。 缓存线:现代CPU缓存64字节。不对齐跨缓存线,延迟翻倍。 记住:对齐是优化,不是可选。过度对齐浪费空间,但不足齐更糟。 2. alignof:查询对齐需求 alignof(T) 返回类型T的最小对齐字节数。简单、直观。 #include <print> int main() { std::print("alignof(char): {}\n", alignof(char)); std::print("alignof(int): {}\n", alignof(int)); std::prin...
Java tips
一句话记住 PECS:Producer Extends, Consumer Super 往外读 → extends 往里写 → super 核心概念:箱子的只读/只写 把泛型容器想象成箱子: 通配符 记忆口诀 箱子特性 你能做什么 <? extends T> extends = 读取 里面可能是 T 的任何子类 只能拿出来(读),不能放进去 <? super T> super = 写入 里面可以装 T 的任何父类 只能放进去(写),拿出来只能是 Object <? extends T> - 上界通配符 含义:这个箱子装的是 T 或 T 的子类,但具体是什么不知道。 List<? extends Number> list = new ArrayList<Integer>(); // ✅ 可以读 - 拿出来肯定是 Number Number n = list.get(0); // ❌ 不能写 - 不知道箱子实际是 Integer、Double 还是其他 // list.add(10); // ...
C++特殊成员函数生成规则
在C++中,特殊成员函数(special member functions)由编译器隐式声明并可能生成,包括默认构造函数、析构函数、拷贝/移动构造与赋值,以及新引入的默认比较运算符。这些函数的生成规则取决于用户声明、成员类型和基类。规则设计鼓励零规则(Rule of Zero):依赖编译器默认行为管理资源,避免自定义。 1. 特殊成员函数种类 C++20中共8种: 默认构造函数 T() noexcept; 析构函数 ~T(); 拷贝构造函数 T(const T&); 拷贝赋值运算符 T& operator=(const T&); 移动构造函数 T(T&&) noexcept; 移动赋值运算符 T& operator=(T&&) noexcept; 默认等于运算符(C++20)bool operator==(const T&) const; 三路比较运算符(C++20)std::strong_ordering operator<=>(const T&) const noexcept; ...
C++特殊成员函数生成规则
什么是特殊成员函数 C++ 中的特殊成员函数是指编译器可以自动生成的六种成员函数: 默认构造函数 T() 析构函数 ~T() 拷贝构造函数 T(const T&) 拷贝赋值运算符 T& operator=(const T&) 移动构造函数 T(T&&) (C++11) 移动赋值运算符 T& operator=(T&&) (C++11) 这些函数之所以"特殊",是因为如果你不显式声明它们,编译器可能会自动为你生成。理解这些函数的生成规则对于编写正确的 C++ 类至关重要。 Rule of Zero/Three/Five 在深入生成规则之前,先了解经典的"规则": Rule of Three 如果类需要自定义以下任一函数,那么它很可能需要同时自定义全部三个: 析构函数 拷贝构造函数 拷贝赋值运算符 这通常意味着类管理着某种资源(如动态内存、文件句柄等)。 Rule of Five (C++11) 扩展 Rule of Three,加入移动语义: 析构函数 拷贝构造函数 拷...
Golang Generics
Go 1.18 引入的泛型(Generics)是 Go 历史上最具革命性的特性。它让代码复用和类型安全达到了新高度。 基本语法 泛型函数 // T 是类型参数,any 是约束(表示任意类型) func Map[T, U any](s []T, f func(T) U) []U { result := make([]U, len(s)) for i, v := range s { result[i] = f(v) } return result } // 使用 ints := []int{1, 2, 3} strings := Map(ints, func(i int) string { return fmt.Sprintf("#%d", i) }) // strings: []string{"#1", "#2", "#3"} 泛型类型 type Stack[T any] struct { items []T...
Rust Std Trait
Rust 的 trait 系统是其类型系统的核心。理解这些标准 trait 不是背文档,而是要明白它们背后的设计意图和实际使用场景。 核心 Trait 分类 Rust 标准库的 trait 可以分为几个层次: 标记 Trait - 编译器特殊处理,无实际方法 派生 Trait - 几乎总是用 #[derive] 自动生成 操作 Trait - 运算符重载和类型转换 迭代 Trait - 迭代器生态系统 I/O Trait - 输入输出抽象 标记 Trait(Marker Traits) 这些 trait 没有方法,纯粹用于向编译器传递类型信息。 Sized - 编译期已知大小 pub trait Sized { // 空 trait,编译器内置实现 } 关键点: 绝大多数类型都是 Sized ?Sized 表示"可能不是 Sized",用于 trait object 和切片 这是隐式 bound,不需要显式写出 // 这两个签名等价 fn foo<T>(x: T) {} fn foo<T: ...
Rust 智能指针详解
先搞清楚一件事 Rust 的"智能指针"概念和 C++ 完全是两码事。在 C++ 里,智能指针是用来擦屁股的——程序员管不好内存,标准库帮你想办法。Rust 不一样,所有权系统在编译期就解决了 99% 的内存安全问题,所谓的智能指针只是所有权规则的延伸。 记住这句话:Rust 的智能指针不是为了修复烂代码,而是为了实现特定的数据结构需求。 Box:最简单的堆分配 Box<T> 就是 Rust 版的 std::unique_ptr,但更简单、更严格。 fn main() { // 在堆上分配一个 i32 let b = Box::new(5); println!("{}", b); // 自动解引用 // Box 离开作用域,内存自动释放 } // drop 在这里调用 什么时候用 Box? 递归类型必须用它(这是编译器逼你的): struct ListNode { val: i32, next: Option<Box<ListNode...
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...
golang 简明语法教程
Go语言(Golang)简明语法教程 1. Hello World & 模块 // 初始化模块: go mod init example.com/m // 运行: go run main.go // 编译: go build main.go package main import "fmt" func main() { fmt.Println("Hello, World!") } 包管理 (Go Modules) // 常用命令 // 初始化模块(在项目根目录执行) go mod init github.com/user/project // 下载依赖并整理 go.mod / go.sum go mod tidy // 添加依赖 go get github.com/labstack/echo/v4 go get github.com/labstack/echo/v4@v4.11.0 // 指定版本 go get -u github.com/labstack/echo/v4 // 更新到最新版 // 下载所有依赖(根据...





