si consideri il seguente riscrittura, che espone un modo in cui un compilatore può implementare il codice:
vuoto stackDirection (int * i) { struct __vars_stackDirection { int j; } * __ stackframe_stackDirection = malloc (sizeof (int));
if(&(__stackframe.j) > i)
cout<<"Stack is growing up \n"<<endl;
else
cout<<"Stack is growing down \n"<<endl;
} int main() {
struct __vars_main { int i; } * __ stackframe_main = malloc (sizeof (int));
stackDirection(&(__stackframe.i));
}
Dovrete convenire che __stackframe_stackDirection
e __stackframe_main
sarà essenzialmente casuale. Lo stack può crescere o scendere.
Peggio, state assumendo un modello di linea. O a<b, b<a, or a==b
. Ma per i puntatori questo non regge. Tutti e tre i confronti a<b, b<a and a==b
potrebbero essere falsi allo stesso tempo.
E il tuo codice non funziona, o dov'è il problema? – nothrow
Il problema è che non posso dire se questo codice è corretto – brett
imo un test migliore sarebbe sequenziale _alloca chiamate, come i puntatori dello stack sarebbero nello stesso stack frame, e non sarebbe soggetto ad alcuna ottimizzazione del compilatore – Necrolis