Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C++] bool == char ???

  1. #1

    [C++] bool == char ???

    Ho sempre pensato che una variabile di tipo bool occupasse esattamente 1 bit (1/8 di Bytes)...
    Ma oggi mi sono ricreduto...
    L'istruzione:
    sizeof(bool);
    restituisce 1... Sembra che una var booleana occupi quanto un char...
    Ho pensato che fosse un problema dovuto ad un'approssimazione, ma l'istruzione:
    sizeof(bool[8]);
    restituisce 8...

    Mi sono accorto di ciò notando che il GnomeSystemMonitor segnalava che un mio programma con un'array bidimensionale di tipo bool di dimensione 4096*4096 pesava 16 MegaBytes in memoria, mentre non avrebbe dovuto usarne più di un paio!!!

    E' anche questo un problema di "approssimazione" e in realtà il bool occupa un solo bit, o e' proprio che il bool occupa un char?


    Il programma che stavo sviluppando e' una lavagnetta dove e' possibile colorare di nero un pixel cliccandoci (settandolo a TRUE) e renderlo bianco ricliccandoci (settarlo a FALSE)... Se volessi evitare che una cavolatina simile occupi 16 MB cosa devo fare? Gestire la lavagna come si faceva col C con gli operatori binary | e & ?






    Ho compilato il programma con il g++... Qualcuno che ha qualche altro compilatore potrebbe dirmi se anche con il suo le variabili bool occupano quanto le variabili char?

  2. #2
    potresti risolvere cosi(campo di bit):
    codice:
    struct bool_t
    {
      char val : 1;
    }
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  3. #3
    Originariamente inviato da Luc@s
    potresti risolvere cosi(campo di bit):
    codice:
    struct bool_t
    {
      char val : 1;
    }
    Avevo già provato, ma anche facendo così la sizeof dice che vale 1 byte, e la dimensione totale del programma e' di 16MB...
    La mia domanda è: vengono segnalati 16 MB per un problema di approsismazione o qualcosa di simile, oppure i campi di bit inferiori agli 8 vengono approssimati agli 8 bit?

  4. #4

    ottetti

    Certamente, le macchine moderne lavorano sugli "ottetti".
    Il tipo BOOL è un typedef a qualcosa. E' comodo pensarlo come un bit solo a livello di programmazione, ma in realtà non lo potrà mai essere.
    Questo per il fatto che non puoi scrivere un bit in memoria, al massimo puoi sovrascrivere gli altri 7 e modificarne 1, ma tu scrivi sempre almeno 1 byte.
    Fai partire photoshop, apri una immagine e guarda quanto occuapa in memoria, ci sarà un motivo.

    Usa | e & con un tuo sistema di coordinate se vuoi consumare meno risorse.

    Non puoi allocare 1 bit in memoria.

    Ciao !

  5. #5

    Re: ottetti

    Originariamente inviato da /* Coder */
    Certamente, le macchine moderne lavorano sugli "ottetti".
    Il tipo BOOL è un typedef a qualcosa. E' comodo pensarlo come un bit solo a livello di programmazione, ma in realtà non lo potrà mai essere.
    Questo per il fatto che non puoi scrivere un bit in memoria, al massimo puoi sovrascrivere gli altri 7 e modificarne 1, ma tu scrivi sempre almeno 1 byte.
    Fai partire photoshop, apri una immagine e guarda quanto occuapa in memoria, ci sarà un motivo.
    Per il fatto che le immagini pesino tanto è anche perchè sono a colori...
    L'array per una lavagna tipo quella che ho fatto, ma che supporti i colori deve per forza usare tre array (uno per colore) di tipo char o comunque deve sicuramente usare qualcosa di più di un bool...

    Usa | e & con un tuo sistema di coordinate se vuoi consumare meno risorse.

    Non puoi allocare 1 bit in memoria.

    Ciao !
    Già neppure in assembler lo si può fare, ma credevo che con le variabili di tipo bool (o come minimo con gli array di tipo bool) pensasse il comilatore a usare | e & in questo modo:
    array[0] = il primo bit del primo char
    array[1] = il secondo bit del primo char
    ...
    array[8] = l'ottavo bit del primo char
    array[9] = il primo bit del secondo char

    e quindi
    array[8] = true
    il compilatore lo avrebbe tradotto in
    primo_char | 1
    e
    array[7] = false
    sarebbe stato tradotto in
    primo_char & 253
    Ho sempre pensato che agisse in questo modo, se no dov'è la comodità del tipo bool?
    Chissà se con l'overloading dell'operatore [] per il tipo bool non riesca a fare qualcosa ...
    Bho, domani provo, ora son fuso...

    Grazie per i chiarimenti




    PS: Ho visto che anche i campi di bit soffrono dello stesso problema:
    char x : 4;
    occupa un intero byte... come un char completo Ma allora a cosa servono? :master: :master: :master: Non ne vedrei alcuna utilità se non quella di perfezionare il programma (facendo diminuire le risorse impiegate) in casi estremi tipo il mio

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.