In managed languages, such as Java and C#, where the runtime abstracts away the memory from the developer, such optimisations are almost impossible. C, C++), but they sacrifice readability, maintainability, memory safety, and object abstraction. Such manual memory optimisations are common in unmanaged languages (e.g. Hence, developers need to consider how to place data in memory so as to exploit spatial locality and achieve high memory bandwidth. The vast divide between the speed of CPU and RAM means that effective use of CPU caches is often a prerequisite for high performance on modern architectures.