E' possibile, ma non vedo perchè mai dovrebbe farlo.Originariamente inviato da gogetassj4dp
teoricamente il compilatore potrebbe memorizzare le due cose in modo diverso.
Il compilatore non memorizza matrici...al massimo genera un programma in grado di farlo, ed in ogni caso non esiste un "in base alle righe" o "in base alle colonne", poichè si tratta appunto di una matrice e quindi sono necessarie sempre due dimensioni per localizzare un elemento. Se intendi l'ordine con cui si specificano gli indici di riga e colonna, il discorso è lo stesso: il primo vettore rappresenta le colonne, il secondo le righe, o viceversa, fatto sta che lo spazio occupato è lo stesso.Originariamente inviato da gogetassj4dp
infatti se il compilatore normalmente memorizza le matrici in base alle righe, nel caso in cui si faccia un array di array credo che vengano memorizzate in colonne.
Con "differenza a livello di compilatore" non mi riferivo all'occupazione di memoria che ovviamente è uguale, ma piuttosto alla diversa generazione del file eseguibile che utilizza istruzioni differenti per accedere ai dati, magari meno ottimizzate nel caso di "array di array" rispetto alla matrice.
Il problema non sussiste ne a livello di compilatore ne a livello di sistema operativo; l'unico sospetto - che potrebbe essere magari falso comunque - è che il compilatore generi un eseguibile "meno ottimizzato" nell'accesso utilizzando l'array di array al posto della matrice. In ogni caso, sceglierei comunque una matrice visto che in Pascal esistono gli array multidimensionali...quindi perchè non utilizzarli?Originariamente inviato da gogetassj4dp
A livello logico nn c'è nessun problema ma il problema arriva dal sistema operativo.
Credo che tu abbia fatto un bel po' di confusione; se gli indici vengono scambiati e si eccedono i valori massimi previsti dalla dimensione della matrice (o dell'array di array), l'unica cosa che ottieni - se la ottieni - è un errore di runtime poichè hai cercato di indirizzare un valore che non era incluso nell'area di memoria allocata per tale vettore.Originariamente inviato da gogetassj4dp
per farla breve cmq il problema sta ne fatto che se la matrice viene memorizzata in un modo ma si fa accesso ai dati nel modo opposto, il sistema operativo genera un "errore" chiamato page fault che obbliga il sistema operativo a caricare una nuova pagina di memoria, nel caso in cui la memoria nn sia piena, o prendere una pagina in memoria e metterla su disco fisso per fare spazio a quella contenente i valori della matrice nel caso in cui la memoria sia piena.
Si tratta di un fenomeno ben diverso dal page fault a cui ti riferisci che fa semplicemente parte del meccanismo di "swap" del sistema operativo il quale si occupa di scaricare su disco parte della memoria inutilizzata e ricaricarla all'occorrenza...ma tale meccanismo è trasparente dal punto di vista delle applicazioni e non coincide comunque con il problema di indirizzare un elemento di un vettore o di una matrice specificando un indice superiore ai limiti consentiti.
La frase non è molto chiaro...cosa significa "memorizzare i dati nello stesso modo in cui vengono trattati dal compilatore"? Si utilizzano i dati così come forniti a disposizione dal linguaggio utilizzato; successivamente, il compilatore si occupa di tradurre semplicemente il codice sorgente in codice eseguibile dalla macchina. Gli "aumenti di prestazioni" a cui ti riferisci probabilmente riguardano la scelta di tipi scalari (numeri interi o virgola mobile) direttamente mappabili a tipi interni della CPU per ottenere maggiore velocità di esecuzione, ma questo cosa ha a che vedere con l'argomento? :master:Originariamente inviato da gogetassj4dp
forse nn mi sono spiegato molto bene ma il concetto è che se si memorizzano i dati nello stesso modo in cui vengono trattati dal compilatore ci dovrebbe essere un aumento delle prestazioni del programma perchè la cpu viene usata solo per operazioni che sono affini al programma stesso.