Zdravím, mám aplikaci pro Linux, jejíž stěžejní část je v asm kvůli rychlosti (SIMD). Zákazník teď chce verzi pro Windows s GUI v .NET (resp. celou nevýpočetní částí v .NET). C# umím, abych udělal GUI, síťovou komunikaci apod., ale nevím, jak tam dostat ten kód v asm. Na zkoušku jsem zkusil stejný algoritmus v C# a je řádově pomalejší, takže ten asm má své opodstatnění. Existuje nějaká lepší možnost než udělat nativní DLL a pak použít P/Invoke? (Na Windows moc nedělám, a v .NET jen sporadicky, takže tady fakt nevím, co by bylo nejlepší, teď právě koukám na C++/CLI, jak to je schůdné.)
Nejlepší bude C++/CLI, umí předat pole přímo bez kopírování a pracovat s ním nativně (vytvoří se jen malý thunk). Je-li arr typu array<float>^, stačí pin_ptr<float> ptr = &arr[0]. Teď mám float*, který můžu použít v C a JSA a GC mi na něj nebude sahat (dealokovat/přesouvat). Pozor na překlad pro amd64, v takovém případě nelze použít inline assembler, bude to chtít masm. (Doporučuju dokumentaci Microsoftu k pin_ptr a interior_ptr.)