Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C++] Operatore unario &

    L'operatore unario & fornisce l'indirizzo di una variabile, quindi

    codice:
    cout << &c
    stampa l'indirizzo della variabile c, ad esempio "0x7fff62b0fb44".

    Ora, questo è un indirizzo fisico vero e proprio? Se c è una variabile automatica, starà sullo stack, e 0x7fff62b0fb44 quindi rappresenterà la locazione di memoria della RAM contenente il mio dato?

    Lo chiedo perché se così fosse allora non mi tornano delle cose, nel caso vi dico!
    /*NO COMMENT*/

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    No .... non sono indirizzi fisici ma virtuali (mappati dal SO e dalla CPU su memoria fisica o disco)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Perfetto.
    Allora ipotizziamo, io alloco dinamicamente un oggetto. Ed ho un puntatore ad esso. Ora con una fork() genero un figlio, esso avrà una copia dell'area heap, e quindi anche dell'oggetto. La variabile che punta all'oggetto, punta sempre allo stesso indirizzo, ma in effetti non punta alla stessa cosa, giusto?
    /*NO COMMENT*/

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Linux usa la tecnica del "copy-on-write".

    Dopo una fork, il padre e il figlio "condividono" gli stessi dati (page shared). Quando uno dei due scrive, vengono fatte due copie diverse dei dati e da quel momento questi sono indipendenti (copy-on-write).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ogni processo ha la propia immagine della memoria.

  6. #6
    Originariamente inviato da MaStErYuRi
    Perfetto.
    Allora ipotizziamo, io alloco dinamicamente un oggetto. Ed ho un puntatore ad esso. Ora con una fork() genero un figlio, esso avrà una copia dell'area heap, e quindi anche dell'oggetto. La variabile che punta all'oggetto, punta sempre allo stesso indirizzo, ma in effetti non punta alla stessa cosa, giusto?
    Bisogna distinguere i vari "livelli".
    Concettualmente la fork() crea una copia completa dello spazio di indirizzi virtuali, per cui in entrambi i processi la variabile punta allo stesso indirizzo, ma, di nuovo, concettualmente sono due cose diverse.
    Dico concettualmente perché, in pratica, in genere fino a quando non ci si va a scrivere la pagina di memoria fisica a cui si riferisce quell'indirizzo è di fatto condivisa tra i due processi in maniera trasparente, e viene copiata in una pagina separata solo nel momento in cui una delle due viene modificata.

    Per cui, subito dopo la fork:
    - l'indirizzo è lo stesso;
    - lo spazio di indirizzi è separato;
    - ma la pagina di memoria fisica/del file di swap che ci sta dietro è la stessa.

    Quando si modifica il valore:
    - l'indirizzo è lo stesso;
    - lo spazio di indirizzi è separato;
    - dietro a ciascuna copia ci sta una pagina di memoria fisica/del file di swap separata.

    In ogni caso ribadisco che il concetto è che dopo la fork i due spazi di indirizzi sono completamente separati.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Grazie a tutti, chiarito
    /*NO COMMENT*/

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Di nulla ... anche se non ho capito se era solo curiosità o se c'era un motivo specifico ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Lo scopo è puramente didattico, per l'università
    /*NO COMMENT*/

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.