断言 VS 静态断言
特性 | 断言 (assert ) | 静态断言 (static_assert ) |
---|---|---|
检查时间 | 运行时 | 编译时 |
使用场景 | 检查运行时假设和不变性 | 验证编译时条件 |
影响 | 条件不成立时终止程序 | 条件不成立时引发编译错误 |
性能 | 在非调试模式下可关闭,以提高性能 | 不影响运行时性能 |
错误消息 | 提供错误信息并终止程序 | 编译时错误信息 |
初始化要求 | 需要包含 <cassert> | C++11 引入,无需额外头文件 |
语法 | assert(condition); | static_assert(condition, "Error message"); |
nullptr VS NULL VS 0
特性 | nullptr | NULL | 0 |
---|---|---|---|
定义 | 空指针常量 | 宏(通常为 0 或 ((void*)0) ) | 整数常量 |
类型 | std::nullptr_t | 整数型(在上下文中被视为指针) | 整数型(在上下文中被视为指针) |
类型安全 | 提供良好的类型安全 | 存在类型不明确的问题 | 存在类型不明确的问题 |
可读性 | 提供明确的语义 | 可能引起误解 | 可能引起误解 |
C++11 引入 | 是 | 否 | 否 |
例子 | int* p = nullptr; | int* p = NULL; | int* p = 0; |
初始化方式对比
初始化方式 | 语法示例 | 适用对象 | 特点与说明 | 引入版本 |
---|---|---|---|---|
默认初始化 | int x; | 基本类型、类类型 | 局部变量未定义,静态变量初始化为零。 | C++98 |
列表初始化 | int a{5}; | 所有类型 | 防止窄化转换,清晰表达初始化意图。 | C++11 |
拷贝初始化 | int b = x; | 所有支持赋值的类型 | 使用 = 进行初始化,可能引入不必要的拷贝。 | C++98 |
直接初始化 | std::string str("Hello"); | 对象类型 | 直接调用构造函数进行初始化,适合类的资源管理。 | C++98 |
统一初始化 | int c = {10}; | 所有类型 | 使用花括号,通过一种方式初始化,更安全、简洁。 | C++11 |
常见的调用惯例
调用惯例 | 描述 | 参数传递 | 堆栈清理 | 支持可变参数 | 适用场景 |
---|---|---|---|---|---|
cdecl | 默认的 C 调用惯例 | 右到左 | 调用者 | 是 | 一般 C 函数,包括可变参数函数 |
stdcall | Windows API 函数调用 | 右到左 | 被调用者 | 否 | Windows API,例如 GUI 组件 |
fastcall | 高效调用,寄存器传递参数 | 部分寄存器 | 调用者 | 否 | 性能敏感的函数,游戏编程 |
thiscall | C++ 非静态成员函数调用 | this 为寄存器 | 调用者 | 否 | C++ 对象方法 |
vectorcall | SIMD 和浮点参数的高效调用 | 多寄存器 | 调用者 | 否 | 高性能计算,例如图形处理 |
pascal | Pascal 语言的调用惯例 | 左到右 | 被调用者 | 否 | 与 Pascal 语言库交互 |
regcall | 特定寄存器用于参数传递 | 寄存器 | 调用者 | 否 | 高度优化的函数,嵌入式系统等 |
mmap 第 4 个参数(flags)汇总表
标志 | 描述 | 适用场景 |
---|---|---|
MAP_SHARED | 创建共享映射,对映射区域的写操作会影响原始文件 | 多个进程需要读写同一文件或共享数据 |
MAP_PRIVATE | 创建私有映射,对映射区域的写操作不会影响原始文件 | 进程需要对文件进行临时修改,且不希望影响其他进程 |
MAP_ANONYMOUS | 创建匿名映射,与任何文件无关,文件描述符必须为 -1 | 用于进程间共享内存或分配动态内存 |
MAP_FIXED | 映射至指定地址,如果该地址已被占用,将导致 mmap 失败 | 需要精确控制内存布局,如系统编程或操作系统开发 |
MAP_NORESERVE | 不保证内存保留,不为未使用页面预留内存 | 用于优化内存使用情况,减少内存预留 |
MAP_POPULATE | 预先填充映射的物理内存页面,尽量将所有映射的页面加载到物理内存中 | 提高性能,特别是在未来将频繁访问某些区域的情况下 |