PDA

View Full Version : [C] domanda tecnica sulla gestione di variabili e allocazione di memoria


Freaxxx
15-09-2011, 21:36
#include <stdio.h>

int main(){
int i=0;
*&i=5;
printf("\n%d",i);
}

parlando dello standard C ( C99 magari ), viene definito cosa accade nel dettaglio? Mi spiego meglio:

mi viene allocata una variabile di tipo int nominata i
alla seconda riga, seguendo la precedenza degli operatori, viene eseguito quanto segue:

l'operatore & mi genera un puntatore ad i
il puntatore viene deferenziato
il contenuto della variabile puntata viene posto a 5



ora la mia domanda: dove viene allocato il puntatore e che etichetta/nome ha? si può allocare una variabile senza darle un nome ( parlando sia dello stack che dell'heap ) ?

Parlando di calcolo parallelo, se la macchina incontrasse 2 istruzioni con lo stesso scopo come i=5 e *&i=5, si creerebbero problemi di concorrenza all'accesso del dato, giusto?

I sistemi operativi hanno policy chiare sul tetto massimo di byte che un programma/processo può allocare? esiste un algoritmo che dia la quantità del massimo allocabile?

AngeL)
16-09-2011, 12:54
g++ test.cpp -S -O0

movl $0, 28(%esp) //int i = 0
movl $5, 28(%esp) //i = 5
movl 28(%esp), %eax //da qui in poi mette gli argomenti sullo stack e chiama printf.
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf

in pratica, il compilatore non dereferenzia un puntatore ad i, che è allocata sullo stack, ma semplicemente risolve *&i sostituendolo con i. Non esiste l' "indirizzo dell'indirizzo" di i perchè il compilatore lavora direttamente con l'indirizzo di i, non c'è un altro layer.

Floris
19-09-2011, 16:57
I sistemi operativi hanno policy chiare sul tetto massimo di byte che un programma/processo può allocare? esiste un algoritmo che dia la quantità del massimo allocabile?

Per un processo su architettura a 32bit il massimo dovrebbe corrispondere al massimo spazio indirizzabile, cioè circa 4GB, o meno se la memoria virtuale totale è inferiore. In architetture a 64bit il massimo dovrebbe essere irraggiungibile! :sofico: ...o in ogni caso limitato dal massimo impostato per la memoria virtuale.
Poi non ricordo se le tabelle delle pagine dei processi impongano dei limiti più bassi...magari stasera provo a riguardare l'argomento e poi ti so dire.

Parlando di calcolo parallelo, se la macchina incontrasse 2 istruzioni con lo stesso scopo come i=5 e *&i=5, si creerebbero problemi di concorrenza all'accesso del dato, giusto?

Puoi spiegarti meglio? In generale i problemi si hanno quando il valore della variabile è diverso a seconda che un processo/thread esegua prima o dopo di un altro (race conditions) da cui necessità di lock e mutual exclusion sulla variabile sia nel caso di architetture parallele che multithreaded.
Ma nel tuo caso, essendo le istruzioni identiche, non dovrebbero esservi di tali problemi. Certo, questo è un caso particolare!

GByTe87
19-09-2011, 17:49
Su Unix/Linux (almeno per quanto ne so io, sicuramente un meccanismo parallelo esiste anche in casa MS) è possibile impostare dei limiti attraverso il comando ulimit (http://ss64.com/bash/ulimit.html) e le chiamate getrlimit + setrlimit (http://linux.die.net/man/2/setrlimit). :)