alignedmem.cpp 495 B

123456789101112131415161718192021
  1. #include "precomp.h"
  2. namespace funasr {
  3. void *AlignedMalloc(size_t alignment, size_t required_bytes)
  4. {
  5. void *p1; // original block
  6. void **p2; // aligned block
  7. int offset = alignment - 1 + sizeof(void *);
  8. if ((p1 = (void *)malloc(required_bytes + offset)) == nullptr) {
  9. return nullptr;
  10. }
  11. p2 = (void **)(((size_t)(p1) + offset) & ~(alignment - 1));
  12. p2[-1] = p1;
  13. return p2;
  14. }
  15. void AlignedFree(void *p)
  16. {
  17. free(((void **)p)[-1]);
  18. }
  19. } // namespace funasr