Skip to content

Commit

Permalink
Merge pull request #242 from fxnut/master
Browse files Browse the repository at this point in the history
Memory Chapter: Converted SVGs to PNGs and updated doc links.
  • Loading branch information
arturoc authored Jan 25, 2017
2 parents a8a5c28 + 4394aee commit 74bbb7e
Show file tree
Hide file tree
Showing 10 changed files with 9 additions and 9 deletions.
18 changes: 9 additions & 9 deletions chapters/memory/chapter.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Internally the computer doesn't really know about that memory area as `i` but as

When we create a variable like `int i` we are telling our program to reserve 4 bytes of memory, associate the address of the first byte of those 4 to the variable name `i` and restrict the type of data that we are going to store in those 4 bytes to only ints.

![Int i](images/int_i.svg "")
![Int i](images/int_i.png "")

Usually memory addresses are represented in [hexadecimal](http://en.wikipedia.org/wiki/Hexadecimal). In c++ you can get the memory address of a variable by using the `&` operator, like:

Expand All @@ -55,7 +55,7 @@ i = 0;

Our memory will look like:

![Int i equals 0](images/int_i_equals_0.svg "")
![Int i equals 0](images/int_i_equals_0.png "")

The order in which the bytes that form the int are layed out in the memory depends on the architecture of our computer, you'll prpbably seen [little endian and big endian](http://en.wikipedia.org/wiki/Endianness) mentioned sometime. Those terms refer to how the bytes of a data type are ordered in memory, if the most significative bytes come first or last. Most of the time we don't really need to know about this order but most modern computer architectures use little endian.

Expand Down Expand Up @@ -156,7 +156,7 @@ int * p = &i;

And what we get in memory is something like:

![Pointer](images/pointer.svg "")
![Pointer](images/pointer.png "")

A pointer usually occupies 4 or 8 bytes (depending if we are on a 32 or 64bits application), we are representing it as 1 byte only to make things easier to understand, but as you can see it's just another variable, that instead of containing a value contains a memory address that points to a value. That's why it's called pointer.

Expand All @@ -169,7 +169,7 @@ int i;
```
We get a memory layout like:

![Int i](images/int_i.svg "")
![Int i](images/int_i.png "")

As we see there's no value in that memory area yet. In other languages like processing doing something like:

Expand Down Expand Up @@ -278,7 +278,7 @@ In both languages the `=` means copy the value of the right side into the variab

This is more or less what memory would look like in Java and C++:

![Objects Java C](images/objects_java_c.svg "")
![Objects Java C](images/objects_java_c.png "")

As you can see in c++ objects in memory are just all their member variables one after another. When we make an object variable equal to another, by default, c++ copies all the object to the left side of the equal operator.

Expand Down Expand Up @@ -309,7 +309,7 @@ p2 = p1;

Well as before c++ will copy the contents of p1 on p2, the contents of p1 are an ofVec2f which consits of 2 floats x and y and then a pointer to a ParticleSystem, and that's what gets copied, the ParticleSystem itself won't get copied only the pointer to it, so p2 will end up having a copy of the position of p2 and a pointer to the same ParticleSystem but we'll have only 1 particle system.

![Object pointers](images/object_pointers.svg "")
![Object pointers](images/object_pointers.png "")

The fact that things are copied by default and that objects can be stored in the stack as oposed to being always a pointer has certain adavantages. For example, in c++ a vector or an array of particles like the ones we've used in the last example will look like:

Expand Down Expand Up @@ -618,7 +618,7 @@ most probably our application will crash if the memory address at arr + 25 is ou

We've just said arr + 25? what does that mean? As we've seen before a variable is just some place in memory, we can get its memory address which is the first byte that is assigned to that variable in memory. With arrays is pretty much the same, for example since we know that an int occupies 4 bytes in memory, an array of 10 ints will occupy 40 bytes and those bytes are contiguous:

![Array](images/array.svg "")
![Array](images/array.png "")

Remember that memory addresses are expressed as hexadecimal so 40 == 0x0028. Now to take the address of an array, as with other variable we might want to use the `&` operator and indeed we can do it like:

Expand Down Expand Up @@ -751,13 +751,13 @@ Vectors have some more features and using them properly might be tricky mostly i

Having objects in memory one after another is most of the time what we want, the access is really fast no matter if we want to access sequentially to each of them or randomly to anyone, since a vector is just an array internally, accessing let's say position 20 in it, just means that internally it just needs to get the memory address of the first position and add 20 to it. In some cases though, vectors are not the most optimal memory structure. For example, if we want to frequently add or remove elements in the middle of the vector, and you imagine the vector as a memory strip, that means that we need to move the rest of the vector till the end one position to the right and then insert the new element in the free location. In memory there's no such thing as move, moving contiguous memory means copying it and as we've said before, copying memory is a relatively slow operation.

![Vector inserting](images/vector_inserting.svg "")
![Vector inserting](images/vector_inserting.png "")

Sometimes, if there's not enough memory to move/copy the elements, one position to the right, the vector will need to copy the whole thing to a new memory location. If we are working with thousands of elements and doing this very frequently, like for example every frame, this can really slow things down a lot.

To solve that, there's other memory structures like for example lists. In a list, memory, is not contiguous but instead each element has a pointer to the next and previous element so inserting one element just means changing those pointers to point to the newly added element. In a list we never need to move elements around but it's main disadvantage is that not being the elements contiguous in memory it's access can be slightly slower than a vector, also that we can't use it in certain cases like for example to upload data to the graphics card which always wants contiguous memory.

![List](images/list.svg "")
![List](images/list.png "")

Another problem of lists is that trying to access an element in the middle of the list (what is called random access) is slow since we always have to go through all the list till we arrive to the desired element. Lists are used then, when we seldom need to access randomly to a position of it and we need to add or remove elements in the middle frequently. For the specifics of the syntax of a list you can check the [c++ documentation on lists](http://www.cplusplus.com/reference/list/list/)

Expand Down
Binary file added chapters/memory/images/array.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added chapters/memory/images/int_i.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added chapters/memory/images/int_i_equals_0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added chapters/memory/images/list.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added chapters/memory/images/object_pointers.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added chapters/memory/images/objects_java_c.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added chapters/memory/images/pointer.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added chapters/memory/images/stack.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added chapters/memory/images/vector_inserting.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 74bbb7e

Please sign in to comment.