1. 什么是零成本抽象?
-
定义:
零成本抽象(Zero-Cost Abstraction)指高级语言抽象(如类、模板、lambda)在编译后生成的代码效率与手写底层代码完全一致,既保留高级语言的开发效率,又不牺牲运行时性能。
-
C++ 的核心哲学:
“你不为不使用的功能付费”(You don’t pay for what you don’t use)。
-
关键工具:
-
模板元编程(TMP):编译期计算与类型操作。
-
constexpr
:编译期函数与常量表达式。
-
2. 模板元编程(TMP):编译期计算的魔法
(1) TMP 的基本概念
-
模板特化与递归:通过模板偏特化和递归实例化实现编译期逻辑。
-
类型萃取(Type Traits):
<type_traits>
头文件中的工具(如std::is_integral<T>
)。
(2) 经典 TMP 案例
案例 1:编译期阶乘计算
template <int N>
struct Factorial {
static constexpr int value = N * Factorial<N - 1>::value;
};
template <>
struct Factorial<0> { // 特化终止递归
static constexpr int value = 1;
};
// 使用:Factorial<5>::value → 120(编译期计算)
案例 2:类型列表操作
template <typename... Ts>
struct TypeList {};
// 获取类型列表的第 N 个类型(编译期索引)
template <size_t N, typename... Ts>
struct GetType;
template <size_t N, typename T, typename... Rest>
struct GetType<N, T, Rest...&