Maximus
Maximus

Reputation: 8431

Faster to use Integers as Booleans?

From a memory access standpoint... is it worth attempting an optimization like this?

int boolean_value = 0;

//magical code happens and boolean_value could be 0 or 1

if(boolean_value)
{
   //do something
}

Instead of

unsigned char boolean_value = 0;

//magical code happens and boolean_value could be 0 or 1

if(boolean_value)
{
   //do something
}

The unsigned char of course takes up only 1 byte as apposed to the integers 4 (assuming 32 bit platform here), but my understanding is that it would be faster for a processor to read the integer value from memory.

Upvotes: 2

Views: 224

Answers (5)

R.. GitHub STOP HELPING ICE
R.. GitHub STOP HELPING ICE

Reputation: 215647

Asking how much memory unsigned char takes versus int is only meaningful when it's in an array (or possibly a structure, if you're careful to order the elements to take care of alignment). As a lone variable, it's very unlikely that you save any memory at all, and the compiler is likely to generate larger code to truncate the upper bits of registers.

As a general policy, never use smaller-than-int types except in arrays unless you have a really good reason other than trying to save space.

Upvotes: 2

nmichaels
nmichaels

Reputation: 51039

This is almost never a good idea. Many systems can only read word-sized chunks from memory at once, so reading a byte then masking or shifting will actually take more code space and just as much (data) memory. If you're using an obscure tiny system, measure, but in general this will actually slow down and bloat your code.

Upvotes: 3

Doug T.
Doug T.

Reputation: 65649

From a memory access standpoint... is it worth attempting an optimization like this?

Probably not. In almost all modern processors, memory will get fetched based on the word size of the processor. In your case, even to get one byte of memory out, your processor probably fetches the entire 32-bit word or more based on the caching of that processor. Your architecture may vary, so you will want to understand how your CPU works to gauge.

But as others have said, it doesn't hurt to try it and measure it.

Upvotes: 3

Spencer Rathbun
Spencer Rathbun

Reputation: 14910

Follow the standard rules of optimization. First, don't optimize. Then test if your code needs it at some point. Then optimize that point. This link provides an excellent intro to the topic of optimization.

http://www.catb.org/~esr/writings/taoup/html/optimizationchapter.html

Upvotes: 0

user25148
user25148

Reputation:

It may or may not be faster, and the speed depends on so many things that a generic answer is impossible. For example: hardware architecture, compiler, compiler options, amount of data (does it fit into L1 cache?), other things competing for the CPU, etc.

The correct answer, therefore, is: try both ways and measure for your particular case.

If measurement does not indicate that one method is significantly faster than the other, opt for the one that is clearer.

Upvotes: 7

Related Questions