XBOX ツールは、デバッグ シンボルとして Microsoft Program Database (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 Compiler とは異なる方法で扱います。具体的には、
__m128、__m128i、__m128d型は構造体ではなく不透明型であるため、これらの型を使用する C++ のオーバーロード関数を作成することはできません。この違いにより、__m128.m128_f32[0]による要素への直接アクセスも clang/LLVM ではコンパイルされません。
このため、DirectXMath は clang/LLVM を使用してビルドする場合に _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++ Team Blog: Introducing ‘Vector Calling Convention’ および Microsoft Docs を参照してください。
自動ベクター化と自動並列化
Visual C++ オプティマイザーは、自動ベクター化機能によって、スカラーの整数演算や浮動小数点演算を SIMD 命令に変換できます。自動ベクター化は/O2 または /Ox で自動的に有効になります。#pragma loop(no_vector) を使用すると、特定のループに対して無効にできます。
これらのコンパイラ ツールセットは、スレッドを使用したループの自動並列化もサポートしています。自動並列化は /Qpar を使用して有効にします。#pragma (loop(hint_parallel(n))) を使用すると、特定のループに対してヒントを指定できます。詳細については、次の記事を参照してください。
バグの報告
Visual C++ コンパイラのバグは、(可能であれば) Visual Studio の [問題の報告…] から報告してください。Microsoft Docs および Developer Community Web サイトを参照してください。コンパイラ向けの適切なバグ レポートの作成方法の詳細については、このページを参照してください。問題を再現するために NDA 対象の追加情報が必要な場合は、“Microsoft only” とマークしたコメントを公開レポートに追加できます。
