Ohhnews

分类导航

$ cd ..
Jetbrains Blog原文

ReSharper C++ 2026.3 发布:类布局、格式字符串分析等新功能

#resharper c++#类布局#格式字符串分析#重构#cuda

ReSharper C++ 2026.3 已发布,新增 类布局(Class Layout)工具窗口,可直观呈现类的内存布局,并帮助你发现被浪费的空间。

此版本还改进了格式字符串分析,现已覆盖 std::format、std::print 和 {fmt} 库。其他亮点包括对 更改签名(Change Signature)和 提取方法(Extract Method)重构的更新,以及新增的 CUDA 检查。
下载 ReSharper C++ 2026.3

类布局

类在内存中的布局方式决定了每个对象占用多少空间、其数据与 CPU 缓存行的契合程度,以及它是否匹配二进制格式或与其他代码共享的 ABI。为满足对齐要求,编译器会悄悄地在字段之间插入填充。因此,一个类最终可能明显大于其各成员大小之和。对于大量分配或在紧密循环中处理的对象,这会迅速累积。

新的 类布局 工具窗口可直观呈现类、结构体或联合体的内存布局,包括每个字段和位字段的偏移量与大小、基类子对象、虚表指针以及它们之间的填充。这样可以轻松找出可消除的填充,检查 alignas 或 #pragma pack 的效果,并理解复杂继承层次中类的布局。要打开该工具窗口,请将光标置于类名或任何类类型引用上,然后选择 ReSharper | 检查 | 类布局。或者,在 Alt+Enter 菜单中选择 类布局 项。 [LOADING...]

重构

构造函数的 更改签名

更改签名 重构现在适用于构造函数。你可以添加、删除、重排序构造函数参数,以及更改其类型,ReSharper C++ 会更新代码中所有构造函数调用,包括直接初始化和花括号初始化、new 表达式、成员和基类初始化器,以及 std::make_unique 等工厂函数。更改签名 对话框还新增了两个选项,可用于添加或移除函数上的 static 说明符和构造函数上的 explicit 说明符。

注意:某些构造函数调用,例如隐式转换或通过自定义工厂模板进行的调用,无法被找到,因此不会被更新。 [LOADING...]

提取方法 的放置位置

提取方法 重构现在有一个 放置位置(Place in)选项,用于控制提取出的函数放在哪里:可以放在当前函数旁边,作为包含当前类的命名空间中的自由函数,或作为匿名命名空间中的自由函数。新增的 设为 constexpr(Make constexpr)选项还允许将提取出的函数标记为 constexpr。 [LOADING...]

引入 using 指令

新的 引入 using 指令 重构会将命名空间限定符(例如 std::cout 中的 std)替换为 using namespace 指令。 [LOADING...]

格式字符串分析

std::format、std::print 和 {fmt}

ReSharper C++ 长期以来一直分析对类似 printf 的函数的调用。在 2026.3 中,同样的分析已扩展到 C++20 <format> 和 C++23 <print> 标准库头文件,以及流行的 {fmt} 库。ReSharper C++ 现在会分析来自 std 和 fmt 命名空间的 format、format_to、format_to_n、formatted_size、print 和 println 调用:

  • 格式字符串中的替换字段会被高亮显示。当光标位于某个替换字段上时,对应的实参也会被高亮,反之亦然。
  • ReSharper C++ 会报告无效的替换字段、缺失和未使用的实参,以及混用自动和手动实参索引的格式字符串。
  • 格式规范会根据实参类型进行检查。例如,使用 d 表示类型格式化 double 会被报告,并提供一个快速修复将其替换为匹配的表示类型。
  • 对于 {fmt} 库,通过 fmt::arg 支持命名实参。

[LOADING...]

printf 更新

对类似 printf 的函数的分析现在支持 C23 中新增的格式说明符。ReSharper C++ 还能理解 POSIX 位置实参,例如 %1$s 和 %2$*1$d,并按位置检查实参类型。一项新检查会报告混用位置实参和非位置实参的 printf 调用。 [LOADING...]

Unreal Engine 日志宏

格式字符串分析现在支持 UE_LOGFMT 以及相关的 Unreal Engine 结构化日志宏。ReSharper C++ 会高亮格式字符串中的字段,将其与实参匹配,并报告缺失或未使用的实参以及无效的字段名。 [LOADING...]

构造函数上的格式属性

[[jetbrains::format]] 和 [[gnu::format]] 属性现在可以应用于构造函数,因此 ReSharper C++ 会检查构造函数调用中的格式字符串。此外,ReSharper C++ 现在还能识别该属性的下划线拼写形式 [[__gnu__::__format__(__printf__, 1, 2)]],以及属性实参索引中的常量表达式。 [LOADING...]

代码分析

Clang-Tidy 集成

捆绑的 Clang-Tidy 二进制文件已更新到 LLVM 23,带来了最新 LLVM 版本中的新检查和改进。Clang-Format 也已更新。

检查名称中带通配符的 NOLINT 注释(例如 // NOLINT(readability-*))现在也会抑制与匹配的 Clang-Tidy 检查相对应的 ReSharper C++ 检查。此外,Clang-Tidy 选项页上新增的 Additional clang-tidy command-line arguments 设置允许你向 Clang-Tidy 传递额外参数。 [LOADING...]

失败约束的说明

当 requires 表达式求值为 false 时,ReSharper C++ 现在会显示哪个要求失败以及其表达式为何非良构。例如,函数或运算符可能不可访问或已被删除,或者实参数量与候选函数不匹配。同样,关于已删除构造函数和可析构性检查失败的错误消息现在会显示完整的原因链,直至导致问题的具体基类或字段。 [LOADING...]

CUDA

ReSharper C++ 2026.3 通过一组新检查扩展了 CUDA 支持,你可以在检查严重级别设置页面上新增的 CUDA 组中配置这些检查:

  • 执行空间:ReSharper C++ 会遵循 CUDA 编程指南的规则,检查函数是否可以从调用代码所在的 CUDA 执行空间调用。该检查会考虑 __CUDA_ARCH__ 防护、CUDA 运行时 API 函数、设备代码中可用的 C 库函数(如 printf 和 malloc),以及对重载运算符的调用。
  • 内存空间:新检查会检测 __device__、__constant__、__shared__、__managed__ 和 __grid_constant__ 说明符的无效使用。示例包括在数据成员或函数参数上使用内存空间说明符、在 __shared__ 变量上使用初始化器,以及说明符冲突。
  • CUDA Tile:新检查会强制执行 CUDA Tile 编程模型的限制。例如,它们会报告 __tile_global__ 函数循环内部的 goto 和 return 语句,以及使用不为 1 的块大小启动的 tile 内核。一项建议还会检测可替换为基于范围的 for 循环(遍历 cuda::tiles::irange)的循环。

[LOADING...]

语言支持

ReSharper C++ 2026.3 支持近期 C++ 标准中的更多特性:

  • C++23 定界转义序列:\x{...}、\o{...} 和 \u{...}(P2290)。
  • C++26 用户生成的 static_assert 消息(P2741)。
  • C++26 #embed 指令的 offset 参数(P3540)。
  • C++26 模块声明之前的 #line 指令(P3868)。

[LOADING...]

Visual Studio 集成

进程外 模式

在 ReSharper 2026.2 中,进程外(Out-of-Process,OOP)模式已成为默认模式。它将繁重的分析工作移出 Visual Studio 进程,有助于防止 UI 冻结并保持输入流畅。在此版本中,我们继续完善 OOP 模式并修复一些遗留问题:

  • Includes Analyzer 现在可在 OOP 模式中使用。
  • Visual Studio 的 F8 和 Shift+F8 快捷键可在 ReSharper 的 查找用法 结果之间导航。
  • 从模板新建 命令再次出现在 C++ 项目的 解决方案资源管理器 上下文菜单中。

CMake 项目中的单元测试

在 Visual Studio 的 打开文件夹 模式下打开的 CMake 项目,现在会在运行单元测试之前,根据单元测试会话的 生成策略(Build Policy)设置进行生成。

告诉我们你的想法

本文介绍了 C++ 支持改进的亮点。请查看 ReSharper 2026.3 新增功能 页面,了解此版本引入的所有其他变更。其中,ReSharper 2026.3 将 Claude 和 Codex 与 Junie 一起带入 Visual Studio。

下载最新版本,并告诉我们它在你的项目中表现如何。
下载 ReSharper C++ 2026.3