XBOX 工具仅支持将 Microsoft 程序数据库 (PDB) 文件用于调试符号。它不支持 LLVM
.ld 文件发出的 CodeView 或 DWARF 调试信息。C++14、C++17 和 C++20 语言版本和功能
Visual Studio 2019、Visual Studio 2022 和 Visual Studio 2026 支持 C++11、C++14 和 C++17。Visual Studio 2022 和 Visual Studio 2026 还支持 C++20。内部函数
Visual C++ 编译器不支持 x64 内联汇编,但支持多种内部函数,以便在 XBOX 开发中使用专用指令集。使用任何内部函数的前提是你已验证目标平台支持相应指令。如果不验证支持情况,应用会在运行时引发
invalid instruction 异常。请特别注意,XBOX One (AMD Jaguar CPU) 支持 AVX 和 F16C,XBOX Series X|S (AMD Hercules CPU) 还支持 AVX2 和 FMA3。这两个平台都不支持 AVX-512 或更高版本的指令。Visual Studio 支持 /arch:AVX 和 /arch:AVX2 开关,这两个开关可启用 AVX 指令集标准中的 VEX 前缀。请对所有 XBOX 应用程序使用此开关。有关详细信息,请参阅以下文章。
clang/LLVM 内部函数
clang/LLVM for Windows 工具集实现了许多与 MSVC 相同的内部函数,但存在一些关键差异:- clang/LLVM 和 GNUC 处理 SSE SIMD 类型的方式与 Visual C++ 和 Intel 编译器不同。具体而言,
__m128、__m128i和__m128d类型是不透明类型而不是结构,因此你无法创建使用这些类型的 C++ 重载函数。这一差异还意味着通过__m128.m128_f32[0]直接访问元素的代码无法在 clang/LLVM 上编译。
因此,使用 clang/LLVM 进行生成时,DirectXMath 会定义 _XM_NO_XMVECTOR_OVERLOADS_。为了获得更好的可移植性,你可以在代码中显式定义此宏,以便对 MSVC 也强制执行此行为。
- clang/LLVM 的 cpuid 内部函数使用特殊标头
#include <cpuid.h>。__cpuid内部函数采用不同的参数列表,而__cpuid_count等效于 MSVC 的__cpuidex,但参数列表同样不同。
调用约定
x64 本机代码的默认调用约定是__fastcall,详见 Microsoft Docs。在 x64 上,__cdecl 和 __stdcall 调用约定只是 __fastcall 的别名。
MSVC 和 clang/LLVM 编译器支持 x86 和 x64 代码的 __vectorcall 调用约定。有关详细信息,请参阅
Visual C++ 团队博客:Introducing ‘Vector Calling Convention’ 和 Microsoft Docs。
自动矢量化程序和自动并行化程序
Visual C++ 优化器可以通过自动矢量化程序将标量整数或浮点计算转换为 SIMD 指令。使用/O2 或 /Ox 时会自动启用自动矢量化程序。你可以使用 #pragma loop(no_vector) 为特定循环禁用它。
这些编译器工具集还支持使用线程对循环进行自动并行化。使用 /Qpar 启用自动并行化。你可以使用 #pragma (loop(hint_parallel(n))) 为特定循环提供提示。有关详细信息,请参阅以下文章。
报告 bug
请 (尽可能) 通过 Visual Studio 的 报告问题… 报告 Visual C++ 编译器 的 bug。请参阅 Microsoft Docs 和开发者社区网站。有关为编译器创建优质 bug 报告的详细信息,请参阅此页面。
如果需要更多 NDA 信息才能重现问题,你可以在公开报告的问题中添加标记为 “Microsoft only” 的评论。
