Category: C++
竞赛选手几乎都会写的两行 C++ 代码 在刷算法题、打竞赛的人里,几乎都能看到 main() 里先写这两行: int main() { ios::sync_with_stdio(false); cin.tie(nullptr); } 很多新手会觉得像“祖传模板”,但它们确实能在 IO 很重的题里显著提速。原因主要有两个:同步和自动刷新。 1) 为什么 ios::sync_with_stdio(false) 能加速? C++ 常用输入输出是 cin / cout。默认情况下,它们会和 C 的 scanf / printf …
理解 C++ 中的 std::transform_reduce 及示例 std::transform_reduce 是一个强大的 C++17 算法,它结合了 transform 和 reduce(或 accumulate)的功能。它允许你对元素进行转换,然后使用二元操作进行归约,从而写出简洁高效的代码。 语法 template<class InputIt1, class InputIt2, class T, class BinaryOp1, class BinaryOp2> T transform_reduce(InputIt1 first1, InputIt1 last1, …
使用原子 TAS 指令实现自旋锁 使用原子 TAS 指令实现自旋锁 Implementing a Spinlock Using the Atomic TAS Instruction 从零实现自旋锁:基于 TAS 的最小同步原语 Building a Spinlock from Scratch with Atomic TAS 用 test-and-set 实现最简单的互斥锁 Implementing …
C++ 一直在不断增加新特性,以便程序员能够区分在编译时运行的代码和在运行时执行的代码。其中两个重要工具是函数 std::is_constant_evaluated()(C++20)和语言级别的 if consteval(C++23)。本文将解释这两者,展示实际示例,比较它们的保证和权衡,并建议在何时使用各自的方法。 这两种技术都允许你编写分支,根据当前的求值是在常量求值(编译时)上下文中还是运行时上下文中而表现不同。差异虽然细微,但非常重要:一个是返回布尔值的函数,另一个是编译器视为仅在编译时检查的特殊 if 语句,编译器会进行特殊处理。 std::is_constant_evaluated() (C++20) 这是一个在 <type_traits> 中声明的函数: #include <type_traits> constexpr bool std::is_constant_evaluated() noexcept; 当当前表达式在常量表达式(编译时)上下文中求值时,该函数返回 true,否则返回 false。 示例: #include <iostream> #include <type_traits> constexpr int …
在现代 C++(C++11 及以后)中,一个非常强大的特性叫做 转发引用(forward references),它让开发者可以通过一个模板函数同时处理左值和右值——而且只需写一次函数模板声明。 虽然语法看起来有点复杂,但本质上,转发引用是一种非常优雅的语法机制,让代码既简洁又高效。 什么是转发引用? 当模板参数以 T&& 的形式出现在函数参数中,并且 T 是通过类型推导得到的,这种情况下就形成了一个 转发引用。例如: template<typename T> void func(T&& arg); 乍一看,这像是右值引用,但实际上是 转发引用,因为 T 是通过类型推导得出的。这个函数既能接受左值,也能接受右值: int x = 5; func(x); // 左值 …
C++ 中的 dynamic_cast 是什么? 用途 在运行时在多态类型之间安全地进行转换 通常用于将基类指针转换为派生类指针(向下转型) 使用 RTTI(运行时类型识别)进行类型检查 基本语法 Derived* d = dynamic_cast<Derived*>(basePtr); 如果 basePtr 实际指向一个 Derived 对象,则转换成功 否则,返回 nullptr 转换失败的情况 指针转换: 如果实际对象不是目标类型,则返回 nullptr 引用转换: 如果失败,会抛出 std::bad_cast 异常 …
什么是 C 中的 restrict? restrict 是 C99 引入的指针类型限定符。它告诉编译器,该指针在其生命周期内是访问其所指内存的唯一方式。 这使得编译器可以安全地进行优化,因为它可以假设没有指针别名 —— 即没有其他指针访问相同的内存。 语法示例: void copy(int *restrict dst, const int *restrict src, size_t n); 优点: 启用更激进的编译器优化 提升在循环和内存密集型操作中的性能 明确表达开发者对指针用途的意图 没有使用 restrict 时: …