2012-01-21 12 views

risposta

7

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.

+1

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'. –

+0

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

1

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.

+3

memset è un altro buon esempio qui, si potrebbe preferire SecureZeroMemory poiché è garantito non essere ottimizzato dal compilatore di windows. – Benj

+0

@ Benj: Perché il compilatore dovrebbe ottimizzare una chiamata a memset? Potresti per favore elaborare? –

+3

@ 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

Problemi correlati