日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Linux下的内存对齐函数

發布時間:2023/11/27 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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下的内存对齐函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。