member variable :1 syntax

A

Angus

In a class I see this syntax for member variables:

int m_myvar:1;

But if I try to access this variable it seems set to zero? So what is
this all about?
 
V

Victor Bazarov

Angus said:
In a class I see this syntax for member variables:

int m_myvar:1;

But if I try to access this variable it seems set to zero? So what is
this all about?

Bit fields. Read about them. The problem is that 1 bit for an integer
is probably not enough to keep any value. Try making it 'unsigned'.
And then assign 1 to it and try reading it back, see what you get.

V
 
A

Angus

Bit fields.  Read about them.  The problem is that 1 bit for an integer
is probably not enough to keep any value.  Try making it 'unsigned'.
And then assign 1 to it and try reading it back, see what you get.

V

Ah yes I see now (I think).

This sort of idea is used a lot in the code I am looking at:
bool m_setting1 :1;
bool m_setting2 :1;
bool m_setting3 :1;
bool m_setting4 :1;

etc etc.

I presume it is for efficiency. A bool variable would normally take
one whole byte. But if you had 8 bool values as above then feasibly
they could all be stored in a bit each - and possibly only use one
byte of storage. Probably not worth doing in many cases but if for
example you were storing vlaues in a database with many rows... then I
can see point.
 
A

Alf P. Steinbach

* Angus:
This sort of idea is used a lot in the code I am looking at:
bool m_setting1 :1;
bool m_setting2 :1;
bool m_setting3 :1;
bool m_setting4 :1;

etc etc.

I presume it is for efficiency.

It's unlikely to improve efficiency, but it can be a good way to conform to some
externally imposed memory layout.


Cheers & hth.,

- Alf
 
A

Angus

* Angus:






It's unlikely to improve efficiency, but it can be a good way to conform to some
externally imposed memory layout.

Cheers & hth.,

- Alf

This example demonstrates a memory advantage:

class myclass
{
public:
bool getboolval() { return m_setting1; }


private:
bool m_setting1:1;
bool m_setting2:1;
bool m_setting3:1;
bool m_setting4:1;
bool m_setting5:1;
bool m_setting6:1;
bool m_setting7:1;
bool m_setting8:1;
};


int main(){
int size = sizeof(myclass);
std::cout << size; //reports 1


If however, the :1 syntax above is removed, then size is reported as
8.

My test was using MSVC++v6 on Windows XP (32 bit).
 
A

Alf P. Steinbach

* Angus:
This example demonstrates a memory advantage:

class myclass
{
public:
bool getboolval() { return m_setting1; }


private:
bool m_setting1:1;
bool m_setting2:1;
bool m_setting3:1;
bool m_setting4:1;
bool m_setting5:1;
bool m_setting6:1;
bool m_setting7:1;
bool m_setting8:1;
};


int main(){
int size = sizeof(myclass);
std::cout << size; //reports 1


If however, the :1 syntax above is removed, then size is reported as
8.

My test was using MSVC++v6 on Windows XP (32 bit).

<digression>
You really should upgrade compiler. You'd get the same result, but MSVC 6 is a
pre-standard compiler and has trouble with modern template code, forces you to
write non-standard code, plus it has a host of bugs in floating point support.
AFAIK the latest MSVC compiler is bundled with the SDK, so it's free even
without installing the lobotimized free version of Visual Studio.
</digression>

Yes, it's a memory advantage, but have you tested efficiency? :)


Cheers, & hth.,

- Alf
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,146
Messages
2,570,832
Members
47,374
Latest member
anuragag27

Latest Threads

Top