# Notes A collection of stuff that we noticed during development. Useful later on two write a project report and to go back in time to find out why certain decisions where made. ## 21.03.2018 - Allocation on stack/static memory We can use the [placement new](https://www.geeksforgeeks.org/placement-new-operator-cpp/) operator for our tasks and other stuff to manage memory. This can allow the pure 'stack based' approach without any memory management suggested by mike. ## 20.03.2018 - Prohibit New We want to write this library without using any runtime memory allocation to better fit the needs of the embedded marked. To make sure we do not do so we add a trick: we link an new implementation into the project (when testing) that will cause an linker error if new is used somewhere. If the linker reports such an error we can switch to debugging by using a new implementation with a break point in it. That way we for example ruled out std::thread, as we found the dynamic memory allocation used in it. ## 20.03.2018 - callable objects and memory allocation / why we use no std::thread When working with any sort of functionality that can be passed to an object or function it is usually passed as: 1. an function pointer and a list of parameter values 2. an lambda, capturing any surrounding parameters needed When we want to pass ANY functionality (with any number of parameters or captured variables) we can not determine the amount of memory before the call is done, making the callable (function + parameters) dynamicly sized. This can be a problem when implementing e.g. a thread class, as the callable has to be stored somewhere. The **std::thread** implementation allocates memory at runtime using **new** when called with any form of parameters for the started function. Because of this (and because the implementation can differ from system to system) we decided to not provide an **std::thread** backend for our internal thread class (that does not use dynamic memory, as it lives on the stack, knowing its size at compile time using templates). Lambdas can be used, as long as we are sure the outer scope still exists while executing (lambda lies in the callers stack), or if we copy the lambda manually to some memory that we know will persist during the call. It is important to know that the lambda wont be freed while it is used, as the captured variables used inside the body are held in the lambda object.