On C lang manual say bool consumed ram as char 8bit, integer 16 bit etc.
Be careful with C. The C standard does not exactly specify the sizes of char, int, long. See "Basic Types" here:'
The relation requirements are that the long long is not smaller than long, which is not smaller than int, which is not smaller than short. As char's size is always the minimum supported data type, no other data types (except bit-fields) can be smaller.
The C standard leaves the actual sizes as implementation dependent. For example int is generally 32 bits now a days. It was 16 bit in MSDOS days. An int is still 16 bits on Arduino and such machines.
One does not have memory addressing down to individual bits because the processor and memory system does not support it. At least not in any machine I have ever seen. Every address will contain the smallest unit of storage, generally 8 bit bytes now a days.
This is also why booleans are stored as bytes rather than individual bits.
One might have some bytes stored consecutively in memory, call them A, B, C, D. They might have memory addresses like so:
A at 0xXXXXXXX4
B at 0xXXXXXXX5
C at 0xXXXXXXX6
D at 0xXXXXXXX7
Where "X" is some hex digit.
Or perhaps you have a 32 bit integer variable, V, stored there:
V at 0xXXXXXXX4
Of course both the bytes A, B, C, D and the integer V could be at the same address at the same time!
In which case one could access the byte at 0xXXXXXXX6 as A which would be the third byte of the integer V.
Hmmm....Or is that the second byte of integer V. Depends on what order the bytes of an integer are stored in memory. Some times it's the low byte first, "little endian", sometimes it's the high byte first, "big endian". I will leave it as an exercide for you to find out what endianness the ARM on the Pi is.
I think you are using the word "virtual" incorrectly.
Virtual memory is the mechanism by which a program can use one address range. Say a megabyte starting at 0x00000000 but that data is actually stored in memory in some other location. The processor is mapping the programs "virtual addresses" to the memory systems "physical addresses". The operating system manages how that mapping is done.
Memory in C++ is a leaky abstraction .