13 #ifndef STXXL_ALIGNED_ALLOC
14 #define STXXL_ALIGNED_ALLOC
16 #include <stxxl/bits/common/utils.h>
19 __STXXL_BEGIN_NAMESPACE
21 template <
size_t ALIGNMENT>
22 inline void * aligned_alloc(
size_t size,
size_t meta_info_size = 0)
24 STXXL_VERBOSE1(
"stxxl::aligned_alloc<" << ALIGNMENT <<
">(), size = " << size <<
", meta info size = " << meta_info_size);
25 char * buffer =
new char[size + ALIGNMENT +
sizeof(
char *) + meta_info_size];
26 #ifdef STXXL_ALIGNED_CALLOC
27 memset(buffer, 0, size + ALIGNMENT +
sizeof(
char *) + meta_info_size);
29 char * reserve_buffer = buffer +
sizeof(
char *) + meta_info_size;
30 char * result = reserve_buffer + ALIGNMENT -
31 (((
unsigned long)reserve_buffer) % (ALIGNMENT)) - meta_info_size;
32 STXXL_VERBOSE1(
"stxxl::aligned_alloc<" << ALIGNMENT <<
">() address 0x" << std::hex <<
long(result)
33 << std::dec <<
" lost " <<
unsigned(result - buffer) <<
" bytes");
34 assert(
int(result - buffer) >=
int(
sizeof(
char *)));
35 *(((
char **)result) - 1) = buffer;
36 STXXL_VERBOSE1(
"stxxl::aligned_alloc<" << ALIGNMENT <<
37 ">(), allocated at " << std::hex << ((
unsigned long)buffer) <<
" returning " << ((
unsigned long)result)
43 template <
size_t ALIGNMENT>
45 aligned_dealloc(
void * ptr)
47 STXXL_VERBOSE2(
"stxxl::aligned_dealloc(<" << ALIGNMENT <<
">), ptr = 0x" << std::hex << (
unsigned long)(ptr) << std::dec);
48 delete[] * (((
char **)ptr) - 1);
53 #endif // !STXXL_ALIGNED_ALLOC