Start Debugging

jit

7 posts

Loop com ref T vs indexação de Span<T> em C#: por que a versão com span é tão rápida quanto ou mais rápida no .NET 10

No .NET 10, um for simples sobre span[i] limitado por span.Length compila para um loop sem verificação de limites, com redução de força e contagem regressiva. Um loop escrito à mão com Unsafe.Add(ref r, i) e índice int mantém uma extensão de sinal e uma comparação de contagem progressiva, e foi medido 2-5% mais lento. Benchmarks e disassembly do JIT para arm64 e x64 no .NET 10.0.10.

O que é o layout transparente de struct, e por que um struct wrapper de campo único muda a convenção de chamada no .NET?

Um struct transparente é aquele que a ABI trata exatamente como seu único campo. O .NET 11 não oferece essa garantia: um struct que encapsula um double é passado em RCX no Windows x64, mas em XMM0 no Linux e no macOS. Veja o disassembly do JIT do .NET 11 em três ABIs, os bugs de P/Invoke que isso causa e como escrever tipos wrapper seguros em qualquer fronteira.