Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [teorico]stdbool.h,tipo booleano

    Salve a tutti,sto da tempo usando il tipo bool in stdbool.h
    Dovrebbe usare un singolo bit di memoria,io ho provato a stampare sizeof(bool) e mi restituisce 1.
    Allora per curiosità ho anche provato a stampare sizeof(bool)*8,pensando che magari l' operatore sizeof stava semplicemente arrotondando.
    Invece niente,mi restituisce 8.Usa 1 byte di memoria comuqnue,anche se 1 bit basta.
    Conoscete un metodo per dire al compilatore direttamente quanta memoria allocare e gestire la cosa senza passare a C++?

  2. #2
    Tramite i campi dei bit di strutture o unioni:


    codice:
    typedef struct boolean
    {
    	unsigned flag : 1;
    
    } BOOL;

    Il valore dopo i ":" rappresenta il numero di bit in cui sarà immagazzinato il membro della struttura. Si tratta comunque di un argomento da trattare con attenzione perchè se non si è sicuri di cosa esattamente si vuole ottenere si arriva solo ad un'applicazione che pecca decisamente in performance, dal momento che lavorare con i singoli bit costringe il compilatore a generare un linguaggio macchina meno efficiente.


    Tuttavia, poichè il membro della struttura è unsigned, essa occuperà in memoria 4 byte effettivi, ne segue che il vantaggio in memoria non c'è. Infatti i campi di bit si usano di solito (o meglio di solito non si usano..) se i membri della struttura sono diversi, solo cosi si ottiene un considerevole risparmio di memoria.
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Il limite non è imposto dal compilatore ma dal sistema operativo che carica l'applicativo. Non accetterebbe un "data segment" con elementi di dimensione inferiore al byte poiché non potrebbe indicizzarli sulla memoria.

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Comunque già usando 1 byte un pò di memoria la risparmio.
    Dici che questo limite dipende dal sistema operativo..hmmm....
    In c++ vale lo stesso?

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Se il limite è imposto dal sistema operativo, nel creare un eseguibile per quel sistema operativo il C++ non può farci nulla, e neppure l'assembly.

    Quando il sistema operativo carica l'eseguibile da disco, crea una sua immagine nella memoria virtuale dove saranno organizzate le variabili inizializzate, quelle non inizializzate e il codice operativo per il processore. Tutte queste informazioni debbono essere raggiunte dal processore mediante un puntatore. Che io sappia Windows (ma anche UNIX) gestisce la memoria virtuale puntando al byte e non al singolo bit.
    Sia che si tratti di un puntatore a 32 bit che un puntatore a 64 bit, ogni incremento di uno provoca lo spostamento al byte sucessivo sulla memoria.

    Se un puntatore fosse capace di puntare al singolo bit, sarebbe molto minore la memoria raggiungibile e dunque allocabile dal sistema.

  6. #6
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ah bene,comunque sto tranquillo che sto usando la minima memoria possibile.
    Ancora una cosa: quando leggo windows 7 64 bit o 32 bit è questo che influenza la modalità di puntamento?
    Grazie comunque delle risposte.

  7. #7
    Il punto fondamentale è che la granularità dell'indirizzamento della memoria è il byte; dato che non è possibile indirizzare la memoria a singoli bit, non si può avere una variabile che occupa meno spazio di memoria di un byte. Volendo si possono impacchettare 8 bool in una variabile (su architetture con byte composti da 8 bit), ed è ciò che fa l'implementazione particolare di std::vector<bool>, ma in genere si evita perché l'accesso ai singoli membri diventa non atomico e, soprattutto, estremamente lento: la lettura/scrittura in una variabile di dimensioni nativamente supportate dal processore si riduce ad una singola istruzione assembly MOV, mentre per estrarre un bit da una variabile char la questione è più complicata (per leggere serve una MOV, una left shift, una AND e un right shift, per scrivere servono una MOV, due left shift, una AND, una NOT e una OR).

    Il 32/64 bit riguarda le dimensioni dei puntatori; cambia la quantità di memoria indirizzabile, ma non la granularità dell'indirizzamento.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.