# Size of immutables

**URL:** https://discourse.julialang.org/t/size-of-immutables/1855
**Category:** General Usage
**Created:** [February 2, 2017, 8:59pm UTC](https://discourse.julialang.org/t/size-of-immutables/1855 "2017-02-02T20:59:22Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![gdkrmr](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gdkrmr/32/2791_2.png) [@gdkrmr](https://discourse.julialang.org/u/gdkrmr)
#### Post date: [February 2, 2017, 8:59pm UTC](https://discourse.julialang.org/t/size-of-immutables/1855/1 "2017-02-02T20:59:22Z")

</div>

Why is `sizeof(M.C)` larger than the others? Tested with 0.5.0, 0.4.7 and 0.6.0-dev.2525.

```julia
julia> module M
       immutable A
           e::UInt32
           a::UInt32
           b::UInt64
       end
       immutable B
           e::UInt64
           a::UInt32
           b::UInt32
       end
       immutable C
           a::UInt32
           e::UInt64
           c::UInt32
       end
       immutable D
           a::UInt32
           c::UInt32
           e::UInt64
       end
       immutable E
           a::UInt64
           e::UInt64
       end
       end
M

julia> sizeof(M.A)
16

julia> sizeof(M.B)
16

julia> sizeof(M.C)
24

julia> sizeof(M.D)
16

julia> sizeof(M.E)
16

```

---

<div class="post-metadata">

### Author: ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)
#### Post date: [February 2, 2017, 9:17pm UTC](https://discourse.julialang.org/t/size-of-immutables/1855/2 "2017-02-02T21:17:36Z")

</div>

Alignment. \<20 char limit\>

---

<div class="post-metadata">

### Author: ![gdkrmr](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gdkrmr/32/2791_2.png) [@gdkrmr](https://discourse.julialang.org/u/gdkrmr)
#### Post date: [February 2, 2017, 9:22pm UTC](https://discourse.julialang.org/t/size-of-immutables/1855/3 "2017-02-02T21:22:32Z")

</div>

what happens, if I do something like `read(mystream, M.C)` vs. `read(mystream, M.B)`, how many bytes are read?

---

<div class="post-metadata">

### Author: ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)
#### Post date: [February 2, 2017, 9:28pm UTC](https://discourse.julialang.org/t/size-of-immutables/1855/4 "2017-02-02T21:28:40Z")

</div>

`sizeof(T)` bytes. And it’ll be platform dependent.

---

<div class="post-metadata">

### Author: ![gdkrmr](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gdkrmr/32/2791_2.png) [@gdkrmr](https://discourse.julialang.org/u/gdkrmr)
#### Post date: [February 2, 2017, 9:37pm UTC](https://discourse.julialang.org/t/size-of-immutables/1855/5 "2017-02-02T21:37:09Z")

</div>

so on my testing computer 8 bytes will get swallowed if i do `my_c = read(mystream, M.C)`

---

<div class="post-metadata">

### Author: ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)
#### Post date: [February 2, 2017, 9:45pm UTC](https://discourse.julialang.org/t/size-of-immutables/1855/6 "2017-02-02T21:45:34Z")

</div>

> [@yuyichao](#):
>
> Alignment.

Just to be clear, this is not unique to Julia. This is the same as what would happen if you declared a C `struct` with those types: the compiler adds padding inside the struct to make sure that data is properly aligned.

See e.g. [data structure alignment on wikipedia](https://en.wikipedia.org/wiki/Data_structure_alignment#Data_structure_padding) or this article on [struct packing](http://www.catb.org/esr/structure-packing/) or [this stackoverflow thread](http://stackoverflow.com/questions/4306186/structure-padding-and-packing).

The fact that Julia properly aligns structure members like this is important for performance, and for calling C libraries.

If you want to read non-aligned binary data from a file, just use `read`. e.g. `C(read(f,UInt32), read(f, UInt64), read(f, UInt32))`. (Of course, for file i/o, you may also need to worry about endianness issues: you might want to call `ntoh` on the result of the `read`.)

---

<div class="post-metadata">

### Author: ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)
#### Post date: [February 2, 2017, 9:49pm UTC](https://discourse.julialang.org/t/size-of-immutables/1855/7 "2017-02-02T21:49:10Z")

</div>

In principle correct. Do we actually have that method?

---

<div class="post-metadata">

### Author: ![gdkrmr](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gdkrmr/32/2791_2.png) [@gdkrmr](https://discourse.julialang.org/u/gdkrmr)
#### Post date: [February 2, 2017, 9:49pm UTC](https://discourse.julialang.org/t/size-of-immutables/1855/8 "2017-02-02T21:49:33Z")

</div>

ok, thank you, that was a very clear answer!

---

<div class="post-metadata">

### Author: ![gdkrmr](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gdkrmr/32/2791_2.png) [@gdkrmr](https://discourse.julialang.org/u/gdkrmr)
#### Post date: [February 4, 2017, 12:59pm UTC](https://discourse.julialang.org/t/size-of-immutables/1855/9 "2017-02-04T12:59:17Z")

</div>

for the sake of completeness:

```julia
  ntoh(x)

  Converts the endianness of a value from Network byte
  order (big-endian) to that used by the Host.

```
