Difference between uint8_t and unspecified int for large matrices
I have a matrix that is over 17,000 x 14,000 that I'm storing in memory in C++. The values will never get over 255 so I'm thinking I should store this matrix as a uint8_开发者_高级运维t type instead of a regular int type. Will the regular int type will assume the native word size (64 bit so 8 bytes per cell) even with an optimizing compiler? I'm assuming I'll use 8x less memory if I store the array as uint8_t?
If you doubt this, you could have just tried it.
Of course it will be smaller.
However, it wholly depends on your usage patterns which will be faster. Profile! Profile! Profile!
Reasons for unexpected performance considerations:
- alignment issues
- elements sharing cache lines (could be positive on sequential access; negative in multicore scenarios)
- increased need for locking on atomic reads/writes (in case of threading)
- reduced applicability of certain optimized MIPS instructions (? - I'm not up-to-date with details here; also a very good optimizing compiler might simply register-allocate temporaries of the right size)
- other, unrelated border conditions, originating from the surrounding code
The standard doesn't specify the exact size of int
other than it's at least the size of short
. On some 64-bit architectures (for example many Linux and Solaris x86 systems I work with) int
is 32 bits and long
is 64 bits. The exact size of each type will of course vary by compiler/hardware.
The best way to find out is to use sizeof(int)
on your system and see how big it is. If you have enough RAM using the native type may in fact be significantly faster than the uint8_t
.
Even the best optimizing compiler is not going to do an analysis of the values of the data that you put into your matrix and assume (anthropomorphizing here) "Hmmm. He said int
but everything is between 0 and 255. I'm going to make that an array of uint8_t
."
The compiler can interpret some keywords such as register
and inline
as suggestions rather than mandates. Types on the other hand are mandates. You told the compiler to use int
so the compiler must use int
. So switching to a uint8_t
matrix will save you a considerable amount of memory here.
精彩评论