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

    [C++]virtual table e memoria occupata

    MItaly io invoco te!

    Questa volta cercherò di essere il più sintetica possibile:

    Se ho una classe che contiene solo membri dati (credo si possano chiamare anche proprietà?) l'operatore sizeof su un'istanza di questa classe mi restituirà una quantità di memoria grande quanto la somma dei singoli membri: ad esempio per una classe che contiene tre char (1 byte), un oggetto di tale classe occuperà 3 byte.

    Se ho una classe che contiene solo metodi virtuali, a prescindere da quanti siano e di che qualità siano questi metodi, un oggetto di tale classe occuperà un'area di memoria della grandezza necessaria a memorizzare un indirizzo (nel mio computer 8 byte), che è l'indirizzo dove risiede la virtual table.

    Ora, ho una classe che contiene sia metodi virtuali che membri di tipo char.
    Andando a logica un'istanza di questa classe dovrebbe richiedere l'allocazione di un'area di memoria di 1*n char + 8 byte.
    Invece succede che, a prescindere dal numero di char, viene allocata un'area di memoria più grande.
    Ad esempio se la mia classe ha da uno ad un massimo di otto char, viene allocata una memoria di 16 byte.
    Ok per gli otto char (8 byte dei char + 8 byte del vptr = 16), ma perché ne alloca 16 anche se la classe ha un solo char, invece di allocare 9 byte?
    E perché se il numero di char è tale da non rientrare in quei 16 byte, ad esempio se i char sono nove, ne vengono allocati 24 di byte e non 17?

    Spero di essere stata abbastanza chiara, grazie a chiunque vorrà rispondermi

  2. #2

    Re: [C++]virtual table e memoria occupata

    Originariamente inviato da serenasere24
    Se ho una classe che contiene solo membri dati (credo si possano chiamare anche proprietà?) l'operatore sizeof su un'istanza di questa classe mi restituirà una quantità di memoria grande quanto la somma dei singoli membri: ad esempio per una classe che contiene tre char (1 byte), un oggetto di tale classe occuperà 3 byte.
    Non è così banale. Bisogna anche considerare l'allineamento dei membri. Per i char va bene, ma se inizi a metterci dopo un puntatore facilmente si salterà un byte (o 5 nelle architetture a 64 bit) per far sì che sia allineato secondo il suo allineamento naturale, che in genere coincide con le dimensioni del tipo.
    Se ho una classe che contiene solo metodi virtuali, a prescindere da quanti siano e di che qualità siano questi metodi, un oggetto di tale classe occuperà un'area di memoria della grandezza necessaria a memorizzare un indirizzo (nel mio computer 8 byte), che è l'indirizzo dove risiede la virtual table.
    Esatto.
    Ora, ho una classe che contiene sia metodi virtuali che membri di tipo char.
    Andando a logica un'istanza di questa classe dovrebbe richiedere l'allocazione di un'area di memoria di 1*n char + 8 byte.
    Invece succede che, a prescindere dal numero di char, viene allocata un'area di memoria più grande.
    Ad esempio se la mia classe ha da uno ad un massimo di otto char, viene allocata una memoria di 16 byte.
    Ok per gli otto char (8 byte dei char + 8 byte del vptr = 16), ma perché ne alloca 16 anche se la classe ha un solo char, invece di allocare 9 byte?
    Poiché nella struttura ora rientra un puntatore, tutto viene allineato a 8 byte (supponendo che tu abbia una macchina a 64 bit), per cui ci saranno dei byte di padding in fondo alla classe. Questo è necessario anche se il vptr sta in testa alla classe, perché comunque se la classe viene usata in un array, se non ci fossero dei byte di padding in fondo, gli elementi successivi al primo si ritroverebbero con un vptr non allineato (ed è fondamentale che il vptr sia allineato, altrimenti l'accesso ad esso diventa estremamente lento su x86, o addirittura impossibile su altre architetture).

    Per inciso, per indagare su come sono allineati i vari "pezzi" delle classi del tuo programma, con g++ puoi usare il flag -fdump-class-hierarchy.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    MItaly chiaro come al solito!
    In effetti ho dato per scontato una cosa sbagliata, ma ora provando a creare una struttura contenente tipi diversi mi sono accorta di quanto hai detto tu. Per il resto la pagina di wikipedia ha fugato ogni dubbio rimanente
    grazie MItaly, un saluto!!

  4. #4
    Lieto di esserti stato utile, alla prossima!
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Visto che il thread è il primo della lista non faccio danni se rispondo eheh grazie MItaly! Lo prendo come un invito a porre presto un'altra domanda ahah

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.