Nella scrittura di codice Win32 C/C++, c'è qualche vantaggio (ad esempio prestazioni?) Nell'utilizzo di funzioni specifiche di Windows come lstrcpyn
o CopyMemory
invece della CRT corrispondente funzioni (oltre alla portabilità delle funzioni CRT)?Funzioni API Win32 rispetto alle controparti CRT (ad esempio CopyMemory vs. memcpy)
risposta
Almeno alcune funzioni CRT utilizzano internamente le funzioni Win32. Anche il CRT richiede un'inizializzazione aggiuntiva (ad esempio dati specifici del thread per funzioni come strtok
) e la pulizia, che potrebbe non essere necessario che si verifichi.
è possibile creare un'applicazione Win32 semplice, senza alcuna dipendenza da qualsiasi altra cosa compresa la CRT (proprio come si potrebbe creare un'applicazione semplice NT utilizzando NTDLL.DLL
- penso smss.exe
di Windows è un tale processo BTW).
Detto questo, penso che per la maggior parte delle applicazioni non importa.
UPDATE Dal momento che le persone sembrano avere così collegato sulla differenza delle singole funzioni, in particolare memcpy
vs. CopyMemory
, vorrei aggiungere che non tutte le funzioni CRT sono wrapper attorno a quelli in Win32. Naturalmente, alcuni possono essere implementati senza alcun aiuto da Win32 (in realtà memcpy
è un buon esempio per quello), mentre altri (sensibilmente) non possono. Qualcosa che, credo, @Merdad ha suggerito nella sua risposta a.
Quindi, a parte la portabilità, non penso che le prestazioni siano il prossimo argomento migliore per o contro l'utilizzo del CRT. Dovresti scegliere ciò che si adatta meglio e che in genere sarà il CRT. E non c'è nulla contro l'utilizzo di singole funzioni Win32 (con equivalenti CRT), dove ti sembra opportuno.
Dipende dalla funzione e dalle vostre esigenze.
Per cose come memcpy
, non c'è alcun punto qualsiasi per scegliere le versioni specifiche di Windows. Attenersi alla norma C per mantenerlo semplice e portatile.
Per altre cose come mbstowcs
, potrebbe essere necessario utilizzare cose come MultiByteToWideChar
invece - a seconda di quale funzionalità è necessario.
Personalmente vado per le versioni C se possibile, e solo dopo vado per le versioni Win32 - perché non c'è davvero alcun motivo per scrivere codice specifico per Windows quando può essere scritto in modo portabile.
memset è un altro buon esempio qui, si potrebbe preferire SecureZeroMemory poiché è garantito non essere ottimizzato dal compilatore di windows. – Benj
@ Benj: Perché il compilatore dovrebbe ottimizzare una chiamata a memset? Potresti per favore elaborare? –
@ Mr_C64 - Certo, il compilatore potrebbe ottimizzare una chiamata a memset se la memoria interessata è in pila e sta per uscire dall'ambito.Questo va bene, tranne che se i dati sono sensibili, come una password, saranno lasciati nei residui dello stack e potrebbero essere esaminati in seguito. – Benj
- 1. Delphi CopyMemory vs C++ memcpy
- 2. Creazione dell'app Visual C++ che non utilizza le funzioni CRT fa ancora riferimento ad alcuni
- 3. funzioni esempio JavaScript rispetto a funzioni di prototipo
- 4. Funzioni pubbliche rispetto alle aree pubbliche
- 5. Win32 mkdir vs _mkdir
- 6. Esempio di client HTTP su win32
- 7. copy_to_user vs memcpy
- 8. strcpy vs. memcpy
- 9. Ruby interfaccia win32 api
- 10. Velocità di esecuzione delle istruzioni condizionali rispetto alle funzioni matematiche
- 11. DrawText VS TextOut Win32
- 12. API Win32 per enumerare le funzioni di esportazione dll?
- 13. Win32 API FindFirstFile e FindNextFile prestazioni vs riga di comando
- 14. Esempio per l'accesso alle funzioni Tcl da Python
- 15. Chiamate API Mocking e Win32
- 16. thread mingw-w64: posix vs win32
- 17. Esempio di proprietà rispetto a metodi JS
- 18. Utilizzo di nullptr nelle chiamate alle funzioni API?
- 19. Bzero() e bcopy() contro memset() e memcpy()
- 20. Come uscire dall'applicazione Win32 tramite API?
- 21. Documentazione C++ Win32 API offline?
- 22. Scala: funzioni normali rispetto a funzioni tuple?
- 23. Che cos'è il livello inferiore su Windows: la libreria C o le funzioni API Win32 corrispondenti?
- 24. Win32 API analogico di invio/cattura SIGTERM
- 25. UPDATE rispetto alle prestazioni INSERTO
- 26. C++ sicurezza rispetto alle eccezioni
- 27. Passaggio alle funzioni lambda C++
- 28. Esistono limitazioni fondamentali che impediscono a Scala di implementare la corrispondenza del modello rispetto alle funzioni?
- 29. API Win32 chiamata Errore GetShortPathName in F #
- 30. Come inserire automaticamente le dichiarazioni API Win32 in C#?
Si noti come esempio di utilizzo di 'memcpy' vs' CopyMemory', che le intestazioni di Windows SDK definiscano 'CopiaMemoria' come una macro che richiama' RtlCopyMemory', che è una macro che richiama 'memcpy'. –
In realtà, 'memcpy',' memmove', 'memcmp',' strlen' e 'memset' sono tutti implementati in ntdll.dll. Pertanto, le funzioni CRT sono ancora wrapper per le funzioni Win32, wrapper per le funzioni NtDll.dll, implementabili autonomamente (ad es. Formattazione e matematica) o parte del punto di ingresso. Ad esempio, Rust non usa MSVCRT per nulla tranne la matematica e il punto di ingresso, e anche questo potrebbe cambiare presto. – alexchandel