Newsgroup: it.comp.lang.c++
Titolo: [?] new alloca più di 65000 bytes?

Ciao,
    ho appena verificato che
    T** Oggetto=new T*[16384]    /* Ogni puntatore occupa 4 bytes */
    non funziona .. non riesce ad allocare un blocco superiore a 65536 bytes
... ma e' proprio vero???
    Grazie per l'aiuto
        Carlini Alessio
PS: Uso Bordland C++ (4.5)

... ma e' proprio vero???
Non mi sembra che new abbia di queste limitazioni. Per simulare situazioni
critiche in fase di test di un mio programma ho allocato con new *ben*
2.000.000 di oggetti da circa 60 bytes l'uno, e non mi ha dato affatto
problemi (a parte l'esaurimento della mem. fisica e lo swap su disco).
Ciao
Domenico

 Domenico
Il mio dubbio e' su un blocco di grandi dimensione e non di più blocchi
piccoli!
E' strano che il mio programma non funzioni proprio quando eccedo
l'allocazione di 64K !!
Ciao
    Carlini Alessio
PS: Resto convito di aver fatto qualche altro errore ma ... non si sa mai :)



 ... ma e' proprio vero???
Dipende dal compilatore.
EMG

 ... ma e' proprio vero???
Chiarisco la situazione che mi sembra mal gestita:
poiché mi l'operatore new gestisce la dimensione con un tipo size_t che
altro non e' che un unsigned ogni volta che si va oltre lui fa un cast con
un semplice warning e ti ritrovi con meno memoria (Magari un solo byte se
hai sfondato solo di un byte)  con ovvi risultati.
Inoltre mi pare che tutta l'heap sia gestita per blocchi di non piů di 64K
byte dunque ogni eccedenza deve essere gestita manualmente pena quanto visto
sopra.
Una cosa che mi ha lasciato interdetto e' che anche una classe (La
TArrayAsVactor) fornita di supporto con il compilatore cade nello stesso
errore se l a si lascia gonfiare oltre il limite suddetto (Es: per un
TArray<double> quando arriva a 8000 di fatto ridimensiona lo spazio per
0byte e poi ricopia 8000 double in quello spazio dando un errore di
protezione generale!).
A me sembra che le cose stiano in questo modo ma vista la stranezza ... mi
chiedo se e' proprio cosě??
    Ciao
        Carlini Alessio

 PS: Resto convito di aver fatto qualche altro errore ma ... non si sa mai :)
E' un buon momento per passare a std::vector...non si sa mai, potrebbe
funzionare.
I limiti di new() dipendono dal compilatore e dalla macchina.
L'argomento e' size_t, che e dimensionato in modo coerente con
l'hardware...


Immagino che stai compilando in ambiente DOS.
Ricordati che in un ambiente a 16 bit
è possibile indirizzare al massimo 64 KByte.
Comunque con il Borland C++ 5.02 non ho problemi,
puoi essere piu dettagliato sul tuo problema?
In che modo non funziona?
Manlio Perillo

l'allocazione di 64K !!
Sì, ma l'operazione che ho fatto io
Field *ptr= new field[2000000]
è uguale a quella che hai fatto tu, solo che io alloco un blocco di memoria
mooolto più grande (e ripeto che non dà problemi, a parte l'ovvio
rallentamento dovuto a chiamate di costruttori exx.)
Ciao
Domenico

 l'hardware...
A me sembra solo un problema dell'operatore new visto che per quanto
riguarda l'hardware basta eventualmente restituire un errore del tipo
"impossibile allocare un blocco maggiore di X Kbyte" quando non si riesca ad
allocare un blocco contiguo di dimensioni sufficienti a soddisfare la
richiesta.
Ciao
    Carlini Alessio

 In che modo non funziona?
    double* p=new double[9000];
    for (i=0;i<9000;i++)
        p[i]=131.413;
    da un errore di protezione generale quando i=808 che guarda caso č
proprio quanto resta togliendo 64K al blocco da allocare ...
Ciao
    Carlini Alessio

A me sembra solo un problema dell'operatore new 
Non credo. Sotto quale piattaforma stai programmando ?
Sicuro che non sia DOS in modalita' reale ?
E' l'unico ad avere il blocco dei 64Kbyte per segmento.
--
Andrea Laforgia (UIN 87230455)
----------------------------------------------------------
Non scrivetemi per e-mail, se non richiesto espressamente.
No replies in private e-mail, unless explicitly requested.
----------------------------------------------------------

    new non aiuta a capire il problema
I problemi riguardanti le dimensioni massime utilizzabili bisogna
conoscerli prima di mettere mano al codice ;)


 ha scritto nel messaggio
news:8q4tvl$s18$1...@nslave2.tin.it...

[OT]
Che modello di memoria usi?
Prova con
  double far* p = new double[9000];
oppure con huge al posto di far.
Hai installato un driver per la momoria espansa (EMM386)?
Manlio Perillo

 rallentamento dovuto a chiamate di costruttori exx.)
Credevo che venissero allocati di volta in volta singolarmente per un totale
di 2000.000 di unità comunque facendolo sul mio mi restituisce direttamente
uno warning dicendomi che 2000.000 e' un long che viene convertito in un
unsigned int dunque perde solo per questo di significato inoltre se vai ad
esaminare il risultato la vera allocazione d' solo (Memoria richiesta)
modulo 64K.

 E' l'unico ad avere il blocco dei 64Kbyte per segmento.
Beh, no, c'era anche lo Z8002... Non sai l'esaltazione quando abbiamo
scoperto lo switch del compilatore che permetteva di separare segmento
codice e segmento dati, permettendoci di superare la barriera dei 64k.
Ciao,
Nicola

codice e segmento dati, permettendoci di superare la barriera dei 64k.
Addirittura !
E dire che 640K sarebbero bastati per chiunque !!! :)


 E' l'unico ad avere il blocco dei 64Kbyte per segmento.
Invece rompe anche sotto Win3.1 ma in modo diverso infatti sotto DOS si
blocca quando esce dal blocco di 64K mentre sotto Win3.1 si blocca perche'
in realtà non alloca la memoria richiesta ma alloca ((Memoria righiesta) %
64K) bytes dunque utilizzando indici al di fuori di quest'area il sistema si
blocca con un errore.
Grazie, comunque visto che mi stavo adagiando sul fatto che fosse tutta
colpa dell'operatore new mentre in effetti la gestione sotto DOS di blocchi
grandi non può essere fatta in modo indolore ....
    Ciao
        Alessio Carlini

blocca quando esce dal blocco di 64K mentre sotto Win3.1 si blocca perche'
Esatto, la colpa e' dei 16 bit.
2^16 = 65536


 E dire che 640K sarebbero bastati per chiunque !!! :)
Leggi meglio. Ho scritto 64k e non 640k. Sugli Onyx (S.O. Unix 7th
Edition) su cui ho realizzato il tema d'esame di Sistemi I  di default
si aveva un unico segmento codice/dati di 64k, mentre con l'opzione
sopra menzionata i segmenti erano due, uno per i dati l'altro per il
codice.
Il mio primo PC invece aveva 320k, poi upgradati a 384!
Ciao,
Nicola Musatti

Leggi meglio. Ho scritto 64k e non 640k.
Leggi meglio. C'era una faccina.
La differenza la conosco ;)


Dipende dal compilatore.
Piu` che altro dalla piattaforma!
Paolo
-------------------------------------------
  Paolo Marotta
 
http://web.tiscalinet.it/paolo_marotta/
-------------------------------------------

 Piu` che altro dalla piattaforma!
C'è differenza pratica? Se un compilatore è stato scritto per una certa
piattaforma non potrà mai superare le limitazioni da essa imposte. Se
faccio girare il TurboC su Win32 Console ottengo comunque di non poter
allocare più di 64 Kb. Se lo cambio con Borland C++ 5.5 risolvo il
problema. Giusto?
EMG

piattaforma non potrą mai superare le limitazioni da essa imposte.
Il compilatore puo` essere disponibile su piu` piattaforme e magari su
XYZ non ha le limitazioni di memoria di ABC.
Quindi le limitazioni vengono dalla piattaforma nel suo complesso, non
solo dal compilatore...
