|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_MEMORY_ALIGNED_MEMORY_H_ | 
|  | #define BASE_MEMORY_ALIGNED_MEMORY_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <type_traits> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/compiler_specific.h" | 
|  | #include "build_config.h" | 
|  |  | 
|  | #if defined(COMPILER_MSVC) | 
|  | #include <malloc.h> | 
|  | #else | 
|  | #include <stdlib.h> | 
|  | #endif | 
|  |  | 
|  | // A runtime sized aligned allocation can be created: | 
|  | // | 
|  | //   float* my_array = static_cast<float*>(AlignedAlloc(size, alignment)); | 
|  | // | 
|  | //   // ... later, to release the memory: | 
|  | //   AlignedFree(my_array); | 
|  | // | 
|  | // Or using unique_ptr: | 
|  | // | 
|  | //   std::unique_ptr<float, AlignedFreeDeleter> my_array( | 
|  | //       static_cast<float*>(AlignedAlloc(size, alignment))); | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | // This can be replaced with std::aligned_malloc when we have C++17. | 
|  | BASE_EXPORT void* AlignedAlloc(size_t size, size_t alignment); | 
|  |  | 
|  | inline void AlignedFree(void* ptr) { | 
|  | #if defined(COMPILER_MSVC) | 
|  | _aligned_free(ptr); | 
|  | #else | 
|  | free(ptr); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | // Deleter for use with unique_ptr. E.g., use as | 
|  | //   std::unique_ptr<Foo, base::AlignedFreeDeleter> foo; | 
|  | struct AlignedFreeDeleter { | 
|  | inline void operator()(void* ptr) const { | 
|  | AlignedFree(ptr); | 
|  | } | 
|  | }; | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_MEMORY_ALIGNED_MEMORY_H_ |