今天看rockdb的代碼, 看到整個程序在分配內存和釋放的內存的時候,並不是直接用的malloc 或者 new 等,而是使用cacheline_aligned_alloc,瞭解了一下相關原理,內存load到緩存的時候 ,是按照cacheline大小load到緩存的,所以進行分配內存的時候,儘量按照cacheline大小進行分配,這樣訪問一個結構體就是訪問一個cacheline,這些細節可以使得程序可能更快吧。把代碼貼上,以後分配內存直接用這個代碼分配。
void *cacheline_aligned_alloc(size_t size) {
#if __GNUC__ < 5 && defined(__SANITIZE_ADDRESS__)
return malloc(size);
#elif ( _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__APPLE__))
void *m;
errno = posix_memalign(&m, CACHE_LINE_SIZE, size);
return errno ? nullptr : m;
#else
return malloc(size);
#endif
}
void cacheline_aligned_free(void *memblock) {
free(memblock);
}