Linux下的内存对齐函数
在Linux下內存對齊的函數包括posix_memalign, aligned_alloc, memalign, valloc, pvalloc,其各個函數的聲明如下:
int posix_memalign(void **memptr, size_t alignment, size_t size);
void *memalign(size_t alignment, size_t size);
void *aligned_alloc(size_t alignment, size_t size);
void *valloc(size_t size);
void *pvalloc(size_t size);
1. posix_memalign函數: 分配size大小的字節,并將分配的內存地址存放在memptr中。分配的內存的地址將是alignment的倍數,且必須是2的冪次方和sizeof(void*)的倍數。如果size為0,則函數返回NULL或一個唯一的指針值,以便可以成功傳遞給free函數。如果分配成功返回0.
2. memalign函數: 是一個廢棄的函數,分配size大小的字節,返回已分配的內存地址指針,其內存地址將是alignment的倍數,且必須是2的冪次方。如果分配失敗返回NULL。
3. aligned_alloc函數: 用法與memalign函數相同,但是size大小應該alignment的倍數。如果分配失敗返回NULL。
4. valloc函數: 是一個廢棄的函數,分配size大小的字節,返回已分配的內存地址指針,其內存地址將是頁大小(page size)的倍數。如果分配失敗返回NULL。
5. pvalloc函數: 是一個廢棄的函數,用法與valloc相似.如果分配失敗返回NULL。
malloc函數總是返回8字節對齊的內存地址,在64bits上是16字節對齊。
以上所有函數均可以通過free函數進行釋放。
alignas也可以用于內存對齊,可以使用alignof來判斷是采用多少字節進行對齊,alignas和alignof要配對使用,否則單獨調用alignof返回的結果是不準確的。
以下是測試代碼(sample_memory_alignment.cpp):
#include <stdlib.h>
#include <malloc.h>
#include <iostream>int main()
{for (int i = 0; i < 100; ++i) {void* p1 = nullptr;size_t alignment = 64;size_t size = 512;int ret = posix_memalign(&p1, alignment, size);void* p2 = memalign(alignment, size);void* p3 = aligned_alloc(alignment, size);void* p4 = valloc(size);void* p5 = pvalloc(size);void* p6 = malloc(size);size_t remainder = 0;remainder = (unsigned long)p1 % alignment;if (remainder != 0)fprintf(stderr, "posix_memalign don't align: %d\n", remainder);remainder = (unsigned long)p2 % alignment;if (remainder != 0)fprintf(stderr, "memalign don't align: %d\n", remainder);remainder = (unsigned long)p3 % alignment;if (remainder != 0)fprintf(stderr, "aligned_alloc don't align: %d\n", remainder);remainder = (unsigned long)p4 % alignment;if (remainder != 0)fprintf(stderr, "valloc don't align: %d\n", remainder);remainder = (unsigned long)p5 % alignment;if (remainder != 0)fprintf(stderr, "pvalloc don't align: %d\n", remainder);remainder = (unsigned long)p6 % alignment;if (remainder != 0)fprintf(stderr, "malloc don't algin: %d\n", remainder);struct Empty{};struct alignas(64) Empty64{};fprintf(stdout, "alignment: %d, %d, %d\n", alignof(Empty), alignof(Empty64), alignof(p6));free(p1); free(p2); free(p3); free(p4); free(p5); free(p6);}fprintf(stdout, "void* size: %d\n", sizeof(void*));return 0;
}
CMakeLists.txt內容如下:
PROJECT(samples_cplusplus)
CMAKE_MINIMUM_REQUIRED(VERSION 3.0)# 支持C++11
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2 -std=c11")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -O2 -std=c++11")INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR})FILE(GLOB samples ${PROJECT_SOURCE_DIR}/*.cpp)FOREACH (sample ${samples})STRING(REGEX MATCH "[^/]+$" sample_file ${sample})STRING(REPLACE ".cpp" "" sample_basename ${sample_file})ADD_EXECUTABLE(test_${sample_basename} ${sample})TARGET_LINK_LIBRARIES(test_${sample_basename} pthread)
ENDFOREACH()
build.sh腳本內容如下:
#! /bin/bashreal_path=$(realpath $0)
dir_name=`dirname "${real_path}"`
echo "real_path: ${real_path}, dir_name: ${dir_name}"new_dir_name=${dir_name}/build
mkdir -p ${new_dir_name}
cd ${new_dir_name}
cmake ..
makecd -
編譯及測試方法如下:首先執行build.sh,然后再執行./build/test_sample_memory_alignment即可。
GitHub: https://github.com/fengbingchun/Linux_Code_Test?
總結
以上是生活随笔為你收集整理的Linux下的内存对齐函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中的内存对齐介绍
- 下一篇: Ubuntu 14.04上安装pip3/