I have the following problem:
I allocate a large chunk of memory (multiple GiB) via mmap
with MAP_ANONYMOUS
. That chunk holds a large hash map w
There is a much easier solution to your problem that is fairly portable:
mmap(ptr, length, PROT_READ|PROT_WRITE, MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
Since MAP_FIXED
is permitted to fail for fairly arbitrary implementation-specific reasons, falling back to memset
if it returns MAP_FAILED
would be advisable.
This madvise
behavior is certainly not standard, so this wouldn't be portable.
If the part that you want to zero out happens to be at the end of your mapping you could get away with ftruncate
. You'd have to introduce one step more:
shm_open
to have a "persistent" file descriptor to your dataftruncate
to the needed sizemmap
of that FDThen you could always
munmap
ftruncate
to something shortftruncate
to the real length you needmmap
againand then the part that you "remapped" would be zero initialized.
But have also in mind that the system has to do the zeroing of the pages. This might be a bit more efficient than the inline stuff that your compiler produces for memset
, but that is not sure.
On Linux, you can rely on MADV_DONTNEED
on an anonymous mapping zeroing the mapping. This isn't portable, though - madvise()
itself isn't standardised. posix_madvise()
is standardised, but the POSIX_MADV_DONTNEED
does not have the same behaviour as the Linux MADV_DONTNEED
flag - posix_madvise()
is always advisory, and does not affect the semantics of the application.