Wasting RAM with < 8 bit datatypes.

Started by
7 comments, last by Kingstone426 20 years, 11 months ago
Perhaps this is a really stupid question but it has been irritating me for some time. If I declare a datatype that uses less than 1 byte of RAM still at least one byte will be reserved as you cannot adress specific bits in the memory directly. Thus: byte myByte; and bool myBool; uses the same amount of RAM. 7 bits of dataloss for the bool, perhaps not so terribly much in this example but if I have say 10 million bools in an array I will lose like 9 MB right? I''ve never read about anyone experiencing this problem so maybe my 10 million bool example is just stupid. Also it could pretty easily be solved by declaring it as a byte array and using bit operations. But lets say we have an OO project with 10 million objects where each one has a bool... Perhaps even more stupid but anyway I''m just wondering if this is a real problem or if somehow the compiler manages it or whatever. Is it different in different languages?
Advertisement
bools are supposed to be 8-bit.
Partial register access kills you, which is why no one makes a bool just one bit. Like you said, you can use bitmasks and even bitvectors to get around this.
The reason is simply that you cannot access memory bit-wise directly. Bit-wise access would slow down bool operations at critical points to unacceptable values.

You can use std::vector that has a specialization for bool, which uses every bit of memory

you can also define the number of bits a variable uses in structs and classes, e.g.
struct test{	bool a : 1;	int b : 2;	int c : 2;};[edited by - novum on May 6, 2003 5:14:28 PM]    
Not that these structures need to be 8 bit aligned. So the shown example won''t compile.

Toolmaker


-Earth is 98% full. Please delete anybody you can.

It does, the compiler will "fill up" the remaining bits
acutally bool is 4 bytes in VC++, is it not?

32 bits!

www.cppnow.com
I checked that after reading the post.

quote:
Microsoft Specific

In Visual C++ 4.2, the Standard C++ header files contained a typedef that equated bool with int. In Visual C++ 5.0 and later, bool is implemented as a built-in type with a size of 1 byte. That means that for Visual C++ 4.2, a call of sizeof(bool) yields 4, while in Visual C++ 5.0 and later, the same call yields 1. This can cause memory corruption problems if you have defined structure members of type bool in Visual C++ 4.2 and are mixing object files (OBJ) and/or DLLs built with the 4.2 and 5.0 or later compilers.

yeah its kind of a sucky problem, but dont expect to be able to declare 1 bit of memory one day: the basic block of 8 bits=1 byte is rooted quite toroughly in cpu design..

bitmasks are indeed your friend here though. if you can combine multiple flags in one byte, and read them out using a bitmask, you lose almost no speed at all, and memory waste isnt that awfull anymore.

This topic is closed to new replies.

Advertisement