As ferramentas do XBOX só funcionam com arquivos Microsoft Program Database (PDB) para símbolos de depuração. Elas não dão suporte às informações de depuração CodeView ou DWARF emitidas pelos arquivos
.ld do LLVM.Versões e recursos das linguagens C++14, C++17 e C++20
O Visual Studio 2019, o Visual Studio 2022 e o Visual Studio 2026 dão suporte a C++11, C++14 e C++17. O Visual Studio 2022 e o Visual Studio 2026 também dão suporte a C++20.Intrínsecos
O compilador Visual C++ não dá suporte a assembly embutido x64, mas dá suporte a uma grande variedade de intrínsecos para permitir a inclusão de conjuntos de instruções especializados no desenvolvimento para XBOX.Qualquer uso de intrínsecos pressupõe que você já verificou se a plataforma de destino dá suporte às instruções. Se você não verificar o suporte, o aplicativo lançará exceções
invalid instruction em tempo de execução. Preste atenção especial ao fato de que o XBOX One (CPU AMD Jaguar) dá suporte a AVX e F16C, e o XBOX Series X|S (CPU AMD Hercules) também dá suporte a AVX2 e FMA3. Nenhuma das plataformas dá suporte a instruções AVX-512 ou posteriores.O Visual Studio dá suporte às opções /arch:AVX e /arch:AVX2, que habilitam o uso do prefixo VEX que faz parte do padrão do conjunto de instruções AVX. Use essa opção em todos os aplicativos XBOX. Para obter mais informações, veja os artigos a seguir.
- Microsoft Docs: x64 Intrinsics
- Intel: AVX
- Games for Windows and the DirectX SDK blog: DirectXMath series
Intrínsecos do clang/LLVM
O conjunto de ferramentas clang/LLVM para Windows implementa muitos dos mesmos intrínsecos que o MSVC, mas existem algumas diferenças importantes:- O clang/LLVM e o GNUC tratam os tipos SIMD SSE de forma diferente do Visual C++ e do Intel Compiler. Especificamente, os tipos
__m128,__m128ie__m128dsão tipos opacos, e não structs, portanto você não pode criar funções C++ sobrecarregadas que usem esses tipos. Essa diferença também significa que o acesso direto a elementos por meio de__m128.m128_f32[0]não é compilado no clang/LLVM.
Por esse motivo, o DirectXMath define _XM_NO_XMVECTOR_OVERLOADS_ ao compilar usando o clang/LLVM. Para melhor portabilidade, você pode definir essa macro explicitamente no seu código para aplicá-la também ao MSVC.
- Os intrínsecos cpuid do clang/LLVM usam um cabeçalho especial,
#include <cpuid.h>. O intrínseco__cpuidusa uma lista de parâmetros diferente, e__cpuid_counté o equivalente ao__cpuidexdo MSVC, mas, novamente, com uma lista de parâmetros diferente.
Convenções de chamada
A convenção de chamada padrão para código nativo x64 é__fastcall, detalhada no Microsoft Docs. As convenções de chamada __cdecl e __stdcall são apenas aliases de __fastcall no x64.
Os compiladores MSVC e clang/LLVM incluem suporte à convenção de chamada __vectorcall para código x86 e x64. Para obter mais informações, veja
Visual C++ Team Blog: Introducing ‘Vector Calling Convention’ e o Microsoft Docs.
Autovetorizador e autoparalelizador
O otimizador do Visual C++ pode transformar cálculos escalares de inteiros ou de ponto flutuante em instruções SIMD por meio do autovetorizador. O autovetorizador é habilitado automaticamente com/O2 ou /Ox. Você pode desabilitá-lo para loops específicos usando #pragma loop(no_vector).
Esses conjuntos de ferramentas de compilador também dão suporte à autoparalelização de loops usando threads. Habilite a autoparalelização usando /Qpar. Você pode fornecer uma dica para um loop específico usando #pragma (loop(hint_parallel(n))). Para obter mais informações, veja o artigo a seguir.
Relatar bugs
Relate bugs do compilador Visual C++ (se possível) por meio de Report a Problem… do Visual Studio. Veja o Microsoft Docs e o site da Developer Community. Para obter detalhes sobre como criar um bom relatório de bug para o compilador, veja esta página.Se forem necessárias mais informações sob NDA para reproduzir o problema, você pode adicionar um comentário marcado como “Microsoft only” a um relatório público de problema.
