106

The documentation says usize is

Operations and constants for pointer-sized unsigned integers.

In most cases, I can replace usize with u32 and nothing happens. So I don't understand why we need two types which are so alike.

Vayn
  • 2,177
  • 4
  • 23
  • 33

2 Answers2

150

As the documentation states usize is pointer-sized, thus its actual size depends on the architecture your are compiling your program for.

As an example, on a 32 bit x86 computer, usize = u32, while on x86_64 computers, usize = u64.

usize gives you the guarantee to be always big enough to hold any pointer or any offset in a data structure, while u32 can be too small on some architectures.

Levans
  • 12,752
  • 3
  • 43
  • 50
  • 4
    Should I always use `usize` type for safety? – Vayn Apr 12 '15 at 17:49
  • 25
    Depends on what you want to do, if holding indexes in a memory structure, yes. For plain numbers, `u32` is often good. The standard library always use `usize` when appropriate, and rust won't silently convert a `u32` to a `usize`, so you'll see when they are needed. – Levans Apr 12 '15 at 17:53
  • 5
    `u32` can also be too big if you're working on embedded systems, which Rust as a systems language is designed to work well with. If `u32` was _always_ too small, the language probably would've been designed to silently convert `u32` into `usize`. – Nicholas Pipitone Oct 31 '18 at 23:02
  • 4
    Note that `usize` might cause confusion in cases you are interested in deterministic behavior or serialisation. – Kostas Kryptos May 15 '19 at 00:45
9

Adding to @Levans' answer,

The size of usize is depended on how much size it takes to reference any location in memory.

on a 32 bit target usize is 4 bytes and on a 64 bit target usize is 8 bytes

All Іѕ Vаиітy
  • 22,178
  • 14
  • 79
  • 103