2011-10-02 7 views
8

Aggiornamento: Il seguente problema sembra dipendere dall'opzione -fwhole-program.In che modo std :: string alloca memoria in GCC con -fwhole-program?

Ho giocato un po 'con l'allocazione della memoria, e ho incontrato un piccolo mistero: In GCC (4.6), come si fa std::string alloca la memoria [modifica] Quando compilo con -fwhole-program [/]?

avere questa seguente programma di test:

#include <new> 
#include <string> 
#include <iostream> 
#include <cstdlib> 

void * operator new(std::size_t n) throw(std::bad_alloc) 
{ 
    void * const p = std::malloc(n); 

    if (p == NULL) throw std::bad_alloc(); 

    std::cerr << "new() requests " << n << " bytes, allocated at " << p << ".\n"; 

    return p; 
} 

void operator delete(void * p) noexcept 
{ 
    std::cerr << "delete() at " << p << ".\n"; 
    std::free(p); 
} 

int main() 
{ 
    std::string s = "Hello world."; 
} 

Quando uso qualsiasi altro contenitore dinamico (che utilizza std::allocator<T>), l'allocatore utilizza ::operator new, e così vedo i messaggi di debug felicemente. Tuttavia, con std::string, non vedo nulla. Sono sicuro che l'assegnazione dinamica avviene, tuttavia, come posso confermare con valgrind (13 byte di lunghezza della stringa più allocati). Ho esaminato diversi file di origine e lo standard, e sono abbastanza sicuro che il modello sia std::basic_string<T, std::char_traits<T>, std::allocator<T>>, quindi non riesco a capire perché non vedo i messaggi dalle funzioni di allocazione sostituite.

Qualcuno può far luce su questo enigma? Cosa devo fare per tenere traccia delle allocazioni di stringhe? Inoltre, qualcuno potrebbe eseguire questo attraverso un altro compilatore e vedere se produce un output?

(Per esempio: se aggiungo std::map<int, int> m { { 0, 1 } };, ho uscita new() requests 24 bytes, allocated at 0x8d53028 ecc)

+0

Attenzione alla piccola ottimizzazione del buffer. Aggiornamento –

+0

: Il problema appare solo (in GCC 4.6.1 e 4.4.3) se compilo con '-fwhole-program'! –

+0

FWIW: Sto ricevendo l'output dal tuo nuovo custom utilizzando g ++ 4.5.2 a 64 bit, in modalità debug o di ottimizzazione. –

risposta

4

Guardando l'uscita di g++ ... -S con/senza -fwhole-program Sembra che tutta la nuova abitudine cancellare operatori/non vengono emessi a tutti quando si utilizza fwhole-program.

Sto iniziando a sospettare che stiamo guardando un bug qui.

+0

Grazie! Forse lo scriverò come un bug, e possiamo vedere se qualcuno degli sviluppatori può confermarlo. –

+0

È strano però che con qualsiasi altro contenitore l'operatore * si * usi! –

+0

Ora è stato risolto nella segnalazione di bug. Grazie! –

Problemi correlati