五、C++新特性、关键字与编译原理 📅 发布时间:2026/8/25 15:48:18 👁 浏览次数: 五、C新特性、关键字与编译原理共25项1.C/C中宏定义的相关知识2.C/C中typedef关键字的相关知识3.介绍一下register关键字4.介绍一下const关键字5.介绍一下external关键字6.介绍一下volatile关键字7.介绍一下dynamic在什么时候使用8.#includefile.h 与 #include file.h的区别9.const和#define有什么区别10.介绍一下static关键字的作用11.完成字符串拷贝可以使用 sprintf、strcpy及 memcpy函数请问这些函数有什么区别。12.C11的新特性都有哪些13.sizeof与strlen的区别14.C17/20/23中哪些特性在AI工程中高频使用15.STL容器在AI数据处理和推理服务中如何选择16.std::string_view、std::span、std::optional在高性能接口中有什么价值17.为什么RAII是C资源管理的核心思想18.在C程序中调用被C编译器编译后的函数为什么要加extern C19.CMake、ABI兼容和依赖管理在AI SDK交付中为什么重要20.C中异常处理机制21.什么时候用static22.头文件中的#ifndef/define/endif有什么作用23.内联函数在编译时是做参数类型检查24.C移动语义和完美转发如何减少AI数据拷贝25.C模板、CRTP和类型擦除如何用于高性能框架结论先行这25项围绕三条主线关键字/预编译宏、const、static、extern、volatile等控制编译与链接行为C现代特性C11/17/20/23 的移动语义、智能指针、string_view/span/optional、模板/CRTP/类型擦除提升性能与类型安全AI工程落地RAII 管理资源、CMake/ABI 兼容保障 SDK 交付、移动语义减少张量/数据拷贝 ⚙️一、预处理与关键字1. 宏定义文本替换无类型检查。#define PI 3.14 #define MAX(a,b) ((a)(b)?(a):(b))缺点无作用域、无类型安全、调试困难。现代 C 优先用const、inline、constexpr、template替代。2.typedef给类型起别名。typedef unsigned int uint; typedef std::vectorint IntVec;C11 后更推荐usingusing uint unsigned int;3.register建议编译器把变量放入寄存器。C11 起已废弃编译器优化通常比人工指定更好。4.const表示只读编译期常量或运行期常量。const int a 10; void foo(const std::string s); // 避免拷贝增强可读性、安全性支持编译期优化。5.extern声明外部定义的全局变量/函数用于跨文件共享。// a.cpp int g_count 0; // b.cpp extern int g_count;6.volatile告诉编译器不要优化该变量每次从内存读取。用于硬件寄存器、多线程中被其他线程修改的变量。但不保证原子性和内存序多线程同步请用std::atomic。7.dynamic什么时候使用应指dynamic_cast用于多态类型间安全向下转型。Base* p new Derived(); Derived* d dynamic_castDerived*(p); // 失败返回 nullptr运行时检查有开销只用于含虚函数的类。8.#include file.hvs#include file.h 从系统/标准库路径查找 先从当前项目路径查找再查系统路径。9.constvs#defineconst#define有类型、作用域、可调试文本替换无类型编译器可优化预处理替换现代 C 推荐尽量少用10.static关键字作用三种场景局部静态变量延长生命周期至程序结束文件内静态变量/函数限制链接域仅当前文件可见类静态成员类级别共享。11.sprintf/strcpy/memcpy区别函数功能安全性strcpy字符串拷贝遇\0停止无边界检查易溢出memcpy按字节拷贝固定长度不处理重叠需保证不越界sprintf格式化输出到字符串无边界检查极易溢出现代 C 推荐std::string、std::snprintf、std::copy。13.sizeofvsstrlensizeof编译期运算符返回类型/对象占用的字节数含\0。strlen运行时函数返回 C 字符串有效长度不含\0。char s[] abc; sizeof(s); // 4 strlen(s); // 318. 调用 C 编译后的函数为何要extern CC 编译器会对函数名做名字修饰name manglingC 编译器不会。extern C告诉 C 编译器按 C 规则链接确保能找到 C 库中的符号。extern C { #include c_lib.h }21. 什么时候用static需要限制全局变量/函数作用域到当前文件函数内需要保持状态的变量类成员需要类级共享。22. 头文件#ifndef/#define/#endif作用防止头文件被多次包含避免重复定义。现代也常用#pragma once更简洁但非标准。23. 内联函数在编译时做参数类型检查是的。内联函数是真正的函数编译器会做类型检查、作用域检查并可能将函数体直接展开到调用处。宏则只做文本替换无类型检查。二、C 新特性12. C11 新特性核心亮点auto/decltype范围 for 循环右值引用与移动语义std::unique_ptr/shared_ptr/weak_ptrnullptrconstexprLambda 表达式并发库thread、mutex、future初始化列表、委托构造、默认/删除函数 default/ deletestd::array、std::tuple、std::unordered_map等14. C17/20/23 在 AI 工程中的高频特性标准特性AI 场景C17std::string_view避免字符串拷贝模型配置名、算子名C17std::optional可选返回值错误处理优雅C17if constexpr编译期分支模板框架C17结构化绑定多返回值解包C20std::span张量切片、缓冲区视图C20Concepts模板约束提升报错可读性C20Modules替代头文件加速编译C20Coroutines异步推理、流式响应C23std::expected显式错误处理三、AI 工程实践15. STL 容器在 AI 数据处理和推理服务中如何选择连续内存 随机访问 →std::vector张量数据、batch频繁插入删除中间元素 →std::list较少用索引/缓存 →std::unordered_map有序配置/日志 →std::map避免拷贝的大缓冲区 →std::span或std::string_view16.string_view/span/optional在高性能接口中的价值string_view只读字符串视图零拷贝传参span连续内存视图安全替代裸指针长度optional显式表达“可能无值”替代魔术值或裸指针降低空指针风险。17. 为什么 RAII 是资源管理核心思想RAII资源获取即初始化。对象构造时获取资源析构时自动释放。结合智能指针能自动管理内存、文件、锁、网络句柄避免泄漏和异常路径遗漏。19. CMake、ABI 兼容和依赖管理在 AI SDK 交付中为什么重要CMake跨平台构建统一编译规则ABI 兼容编译器版本、标准库、编译选项不一致会导致链接/运行时崩溃SDK 交付必须保证 ABI 一致依赖管理OpenCV、CUDA、ONNX Runtime 等依赖复杂需明确版本和传递依赖避免“在我机器上能跑”。20. C 异常处理机制try { throw std::runtime_error(error); } catch (const std::exception e) { // 处理 }异常会沿调用栈展开自动调用局部对象的析构函数栈展开。AI 服务中通常建议核心推理路径少用异常用std::optional/std::expected/错误码保证性能可预测。24. 移动语义和完美转发如何减少 AI 数据拷贝移动语义将资源所有权转移而不是深拷贝。例如大 tensor 从预处理传到推理引擎时用std::move。完美转发std::forward保持参数的左右值属性避免临时对象不必要的拷贝。两者结合能显著降低大模型输入输出、中间特征图的内存拷贝开销 25. 模板、CRTP 和类型擦除如何用于高性能框架模板编译期多态零运行时开销用于泛型算子、张量类型。CRTP奇异递归模板模式静态多态避免虚函数开销实现编译期接口约束。类型擦除运行时统一接口例如std::function、any用于插件系统中隐藏具体类型。模板 CRTP 适合热路径高性能类型擦除适合需要运行时多态的插件边界。整体联系这25项勾勒出一条从源码编译到现代 C 特性再到AI 工程落地的链路宏/关键字/头文件编译链接C11/17/20/23 新特性RAII/智能指针/移动语义高性能接口 string_view/span/optional模板/CRTP/类型擦除框架设计CMake/ABI/SKD 交付掌握这些才能写出既现代、又能在 AI 推理框架和 SDK 中稳定交付的 C 代码