Può lo stile di codifica causare o influenzare la frammentazione della memoria?

4

Come dice il titolo, mi piacerebbe sapere se lo stile di codifica può causare o influenzare la frammentazione della memoria in un'applicazione nativa, in particolare una scritta usando C ++. Se lo fa, mi piacerebbe sapere come.

Un esempio di ciò che intendo per stile di codifica sta usando std::string per rappresentare stringhe (anche stringhe statiche) ed eseguire operazioni su di esse invece di usare la Libreria C (come strcmp , strlen , e così via ) che può funzionare sia su stringhe dinamiche che su stringhe statiche (quest'ultimo punto è vantaggioso poiché non richiede un'assegnazione aggiuntiva per accedere alle funzioni stringa, che non è il caso di std::string ).

Un atteggiamento "lungimirante" che ho con C ++ è quello di non usare il CRT, poiché farlo sarebbe, in un certo senso, un passo indietro. Tuttavia, tale stile comporta allocazioni più dinamiche e, in particolare, per un'applicazione a lunga durata come un server, questo fa pensare che la frammentazione della memoria potrebbe diventare un problema.

    
posta void.pointer 23.05.2012 - 19:27
fonte

3 risposte

1

La domanda e il testo di supporto non coincidono.

Il tuo testo di supporto parla di confrontare l'utilizzo della memoria di due librerie, che può essere testato abbastanza direttamente ed è ortogonale allo stile di codifica. Ad esempio, avvolgi gli operatori di stringa C in un oggetto di stile C ++ sottile e puoi lavorare con essi con un impatto di memoria minimo, ad esempio.

Il titolo della domanda implica differenze nello stile attuale, come allocare / distruggere oggetti come necessario rispetto all'uso di un pool di oggetti, o costruire stringhe con cicli imperativi di logica e concatenazione intrecciati contro costruire una serie di stringhe imperativamente e quindi costruire il finale stringa tutto in una volta.

La risposta a entrambi , tuttavia, è la stessa: sì, possono influenzare la frammentazione della memoria - le librerie sottostanti funzionano in modi diversi in modo che possano influenzare la memoria in modi diversi e il tuo utilizzo delle librerie può anche influire sulla frammentazione della memoria, e lo stile "corretto" dipende probabilmente dalla libreria che stai utilizzando.

La manipolazione delle stringhe in stile C può essere molto leggera sulla memoria e meglio controllata per i problemi di frammentazione, ma condurrà il tuo eseguibile con le variabili per tenere traccia dello stato della stringa di output mentre la assemblate e se non ci metti molto impegno, probabilmente non batterai il codice di std::string per casi di uso comune. Naturalmente, se non hai idea di come std::string funzioni dietro le quinte, potresti anche farlo fare qualcosa di stupido, ma è per te decidere quanto vuoi imparare gli interni dei tuoi strumenti e quanto costa in effetti influisce su ciò che stai cercando di realizzare.

    
risposta data 23.05.2012 - 20:56
fonte
1

Certo, lo stile di codifica può influire sulla frammentazione della memoria poiché lo stile di codifica cambierà i tuoi schemi di allocazione / deallocazione che hanno il maggiore impatto sulla frammentazione.

Detto questo, usare le stringhe C ++ vs C non è uno stile di codifica . Inoltre, esistono diversi stili di codifica (specialmente in C ++) per diminuire la complessità, aumentare la leggibilità, aumentare la testabilità, aumentare la robustezza, aumentare la correttezza o, nel caso del C ++, proteggerti da tutte le mine terrestri. Tutto ciò è molto più importante della frammentazione della memoria.

    
risposta data 23.05.2012 - 21:11
fonte
0

È piuttosto improbabile. La frammentazione, per quanto ne so, non è un problema significativo nei moderni allocatori di memoria.

Inoltre, puoi semplicemente rotolare un allocatore personalizzato che utilizza un'arena o un pool per gestire la memoria.

Naturalmente, la frammentazione è un non-problema completo con le stringhe C, poiché il tuo programma probabilmente si arresterà quasi immediatamente all'avvio grazie a un terminatore NULL mancato e mostrerà molte vulnerabilità di sicurezza e altre cose divertenti, che sarebbero tutte più importante di una piccola frammentazione.

    
risposta data 23.05.2012 - 21:07
fonte

Leggi altre domande sui tag