内容提要
ReSharper C++ 2026.3 新增类布局工具窗口,可可视化类、结构体和联合体的内存布局,显示字段偏移、大小、填充及虚表指针,便于发现浪费空间。格式字符串分析扩展至 std::format、std::print 和 {fmt} 库,并支持 C23 printf 格式符、Unreal 日志宏及构造函数格式属性。重构改进包括构造函数 Change Signature、Extract Method 放置选项和 Introduce Using Directive。此外更新 Clang-Tidy 至 LLVM 23,新增 CUDA 检查,支持更多 C++23/26 特性,并优化 Visual Studio 集成。
延伸解读
类布局工具的实际用途
新类布局工具窗口能显示字段偏移、大小、填充及虚表指针,帮助开发者发现编译器为对齐而插入的填充。文章指出,对于大量分配或紧密循环中处理的对象,这些填充会显著增加内存占用。该工具还可用于检查 alignas 或 #pragma pack 的效果,以及理解复杂继承层次中的布局。
格式字符串分析的扩展与限制
格式字符串分析现已覆盖 std::format、std::print 和 {fmt} 库,能高亮替换字段、检查参数匹配和格式说明符类型。同时支持 C23 printf 格式符、POSIX 位置参数、Unreal 日志宏及构造函数格式属性。但文章未提及对自定义格式函数的支持,分析范围仍限于已知库和属性。
重构改进的注意事项
构造函数现在支持 Change Signature 重构,可增删、重排参数并更新调用点,包括直接初始化、花括号初始化、new 表达式及工厂函数。但文章明确提示,隐式转换或通过自定义工厂模板的调用无法被找到和更新。Extract Method 新增放置选项和 constexpr 标记,Introduce Using Directive 可替换命名空间限定符。
CUDA 检查与语言支持更新
新增 CUDA 检查涵盖执行空间、内存空间和 CUDA Tile 编程模型限制,可在检查严重性设置中配置。语言支持方面,新增 C++23 分隔转义序列、C++26 用户生成 static_assert 消息、#embed 偏移参数及模块声明前的 #line 指令。Clang-Tidy 更新至 LLVM 23,并支持通配符 NOLINT 注释抑制对应检查。
Q&A
ReSharper C++ 2026.3 新增的类布局工具窗口有什么作用?
类布局工具窗口可以可视化类、结构体和联合体的内存布局,显示每个字段和位域的偏移与大小、基类子对象、虚表指针以及填充字节。这有助于发现可消除的填充、检查 alignas 或 #pragma pack 的效果,并理解复杂继承层次中的类布局。
如何打开 ReSharper C++ 的类布局工具窗口?
将光标放在类名或任何引用类类型的位置,然后选择 ReSharper | Inspect | Class Layout。或者,在 Alt+Enter 菜单中选择 Class Layout 项。
ReSharper C++ 2026.3 的格式字符串分析现在支持哪些库和函数?
格式字符串分析现已扩展到 C++20 <format> 和 C++23 <print> 标准库头文件,以及 {fmt} 库。它分析 std 和 fmt 命名空间中的 format、format_to、format_to_n、formatted_size、print 和 println 调用。
Change Signature 重构对构造函数有哪些新支持?
Change Signature 重构现在可用于构造函数,可以添加、删除、重新排序和更改构造函数参数的类型,并更新代码中的所有构造函数调用,包括直接初始化、花括号初始化、new 表达式、成员和基类初始化器以及 std::make_unique 等工厂函数。对话框还新增了添加或移除函数 static 说明符和构造函数 explicit 说明符的选项。
ReSharper C++ 2026.3 新增了哪些 CUDA 检查?
新增的 CUDA 检查包括:执行空间检查(确保函数可从调用代码的 CUDA 执行空间调用)、内存空间检查(检测 __device__、__constant__、__shared__、__managed__ 和 __grid_constant__ 说明符的无效使用)以及 CUDA Tile 检查(强制执行 CUDA Tile 编程模型的限制,例如报告 __tile_global__ 函数循环中的 goto 和 return 语句,以及块大小不为 1 的 tile 内核启动)。
ReSharper C++ 2026.3 支持哪些新的 C++23/26 语言特性?
支持的新特性包括:C++23 分隔转义序列(\x{...}、\o{...} 和 \u{...},P2290)、C++26 用户生成的 static_assert 消息(P2741)、C++26 #embed 指令的偏移参数(P3540)以及 C++26 模块声明前的 #line 指令(P3868)。