Newsgroup: it.comp.lang.c++
Titolo: Dimensione massima string

Salve,
potreste indicarmi qual'č la dimensione massima di una std::string?
Cioé quanti caratteri puů contenere?
Grazie
--
Luigi
http://web.tiscali.it/luigi_web
ICQ #46240443

Cioé quanti caratteri puù contenere?
Non ho trovato il punto esatto in cui BS ne parla ma se non sbaglio
s.lenght() < string::npos, quindi il limite massimo è npos penso che
il limite sia quindi legato alla capacità degli unsigned visto che
npos è un unsigned (o almeno dalle prove che ho fatto con VC++ e g++
sembra essere così).
--
Marco Barisione (ICQ 84277092)

 Grazie
Mi pare che fosse 2048... mi pare.

 
Io ho fatto una prova col g++ sotto linux. Ecco il sorgente:
#include <iostream>
#include <string>
using namespace std;
int main(){
        string str = "Ciao";
        for(int i = 0; i < 1000000000; i++)
                for( int j = 0; j < 1000000000; j++)
                        for (int k = 0; k < 1000000000; k++){
                                str += "a";
                                cout << str.size() << endl;
                                }
        return 0;
}   ;
e questo è l'output  delle ultime righe:
134217724
134217725
134217726
134217727
Abortito
Ora trai tu le conclusioni, ma comunque mi piacerebbe sapere cosa dice lo 
standard.
-- 
Abruzzo Silvio
studente, 16 anni
goku_...@libero.it
silvi...@aruba.it
^____^

 lo standard.
hai 128MB di memoria? se si, immagina un po'...

uffa wrote:

No, ne ho 256 MB. Lo sai che ci avevopensato anch'io.
Ciao


 No, ne ho 256 MB. Lo sai che ci avevopensato anch'io.
be', si vede che quella e' la quantita' di memoria libera :)
 comunque dipende solo dall'ammontare di memoria a disposizione, dato 
che attinge al free storage

 Abortito
DOH !!!!
Non ho capito come hai fatto ad aspettare 134 milioni di cout...
L' hai eseguito da remoto sul computer della NASA o l'hai fatto girare per 
una settimana ? :-)
btw: Non penso che sia il metodo piu' "affidabile" questo per controllare la 
dimensione massima di string... Anche perche' dopo 134 milioni di cout il 
programma potrebbe aver abortito per altre ragioni... E come dargli torto... 
:-)
Ad ogni modo non ho capito perche' non si possa utilizzare max_size(), che 
ritorna 2^32 sul mio sistema.
-- 
- Dado : Extreme Snowboarder
*-> I believe I can fly, I believe I can touch the sky <-*

 
Perchè ho pensato che dopo aver superato questo limite, le stringhe 
allocassero altro spazio, come fanno i vector.
Ciao


> s.lenght() < string::npos,
intendi s.size()    ?


intendi s.size()    ?
Sono la stessa cosa, ma mi domando l'utilità di avere due funzioni che
fanno la stessa cosa, qualcuno ne ha idea?


ritorna 2^32 sul mio sistema.
In effetti è questo il metodo giusto :-)


 wrote in message
3b9200e7...@news.inwind.it...


 
 
std::string ha sia length() che size().
Entrambi restituiscono la lunghezza della stringa.
Max

 
std::string puň anche allocare molta piů RAM di quanta ne serve al
momento. Questo dipende dalla policy che adotta la particolare
implementazione nella gestione della riallocazione. 
Se un'implementazione dovesse effettuare un'allocazione e una copia ad
ogni operazione che richiede un ridimensionamento anche minimo del buffer
il risultato sarebbe estremamente inefficiente.
Max

 buffer il risultato sarebbe estremamente inefficiente.
e chi ha parlato di ram? io parlavo di memoria, anche virtuale, a 
disposizione. che poi linux limiti le stringhe a 128MB-1, potrebbe 
dipendere dal fatto che e' un utente, poi provo da root

 dipendere dal fatto che e' un utente, poi provo da root
ho provato: a parte quanto ritornato da max_size (limite teorico) la 
lunghezza massima su sistemi linux-libstdc++ 2.95.3 e' la potenza di 
due meno uno appena inferiore alla dimensione della memoria ram, 
perche', dato che la policy della string sulla libstdc++ e' di 
raddoppiare la memoria allocata ogni volta che esaurisce la capacita', 
allocando l'intera memoria ram o piu' si ha una bad alloc, in quanto 
essa non e' completamente disponibile. Dovendo ritornare l'oggetto 
stringa in uno stato safe, si elimina l'ultima allocazione e la stringa 
risulta lunga size = capacity - 1, con capacity appunto pari alla 
potenza di due inferiore alla memoria ram del sistema
Non so se questo sia da considerarsi un baco (si potrebbe allocare solo 
quanto disponibile) o un design apposito, fatto e' che e' conforme allo 
standard, il quale permette di lasciare abbastanza memoria per 
concludere il programma in caso di eccezioni.

 e mi da 4294967295
-1 ?
-- 
Luc.

 fanno la stessa cosa, qualcuno ne ha idea?
Soddisfare l'ego di qualche membro del comitato di standardizzazione?
Ciao,
Nicola


Piu' esattamente 2^32 -1 .
Ciao,
Nicola

 No, ne ho 256 MB. Lo sai che ci avevopensato anch'io.
Lo standard ovviamente non specifica nessun limite, ma lascia libere le
varie implementazioni. Il comportamento osservato potrebbe spiegarsi con
una politica di allocazione che raddoppia la memoria ogni volta. Il
primo tentativo che supera la quantita' di memoria disponibile
abortisce. Tenete presente pero' che anche in questo caso il risultato
dipende dal comportamento del sistema operativo (ovvero dalla gestione
della memoria virtuale) piu' che non dalla quantita' di RAM disponibile.
Ciao,
Nicola

 Soddisfare l'ego di qualche membro del comitato di standardizzazione?
penso per usare algoritmi generici che richiedono una size() sulle 
stringhe, oltre che su altri compilatori, e mantenere una funzione 
comprensibile come nome per restituirne la lunghezza... 

 stringhe, oltre che su altri compilatori,
contenitori, ovviamente

 che attinge al free storage
no, non solo. Il membro statico std::string::npos indica il limite massimo 
per la dimensioni di std::string.
Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it