Вы можете определить распределитель страниц:
#include <sys/user.h>
#include <sys/mman.h>
#include <cstddef>
#include <new>
template<class T>
struct page_allocator{
using value_type = T;
static auto mem_size_for(std::size_t n){
n = n * sizeof(T);
return (n & (PAGE_MASK)) + (n & ~(PAGE_MASK) ? PAGE_SIZE:0);
}
T* allocate(std::size_t n){
auto p = mmap(0, mem_size_for(n)
,PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
if (p==MAP_FAILED) throw std::bad_alloc{};
return static_cast<T*>(p);
}
void deallocate(T* p,std::size_t n){
munmap(p,mem_size_for(n));
}
constexpr bool operator==(page_allocator)noexcept{return true;}
constexpr bool operator!=(page_allocator)noexcept{return false;}
};
И использовать его следующим образом:
int main()
{
std::vector<int,page_allocator<int>> v;
v.resize(PAGE_SIZE/sizeof(int));
std::cout << &v[0] << std::endl;
return 0;
}
Другой вариант, используя posix_memalign:
#include <cstddef>
#include <new>
#include <stdlib.h>
template<class T>
struct memalign_allocator{
using value_type = T;
T* allocate(std::size_t n){
void* p;
if (posix_memalign(&p,PAGE_SIZE,n*sizeof(T))) throw std::bad_alloc{};
return static_cast<T*>(p);
}
void deallocate(T* p,std::size_t n){
free(p);
}
constexpr bool operator==(memalign_allocator)noexcept{return true;}
constexpr bool operator!=(memalign_allocator)noexcept{return false;}
};
Использованиеalign_alloc будет работать лучше.