在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下的内存对齐函数相关推荐

  1. Linux 基础知识(2)---Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别

    Linux内核空间内存申请函数kmalloc.kzalloc.vmalloc的区别 kzalloc与kmalloc区别    这个函数就是原来的两个函数的整合 , 即原来我们每次申请内存的时候都会这么 ...

  2. Linux下查看内存泄露的命令

     一.   Linux下确定内存泄露 在做嵌入式开发中,例如,在 Linux 下做 C/C++ 开发,会因为调用 malloc/calloc() 函数,忘记释放堆内存.程序运行久了,会发生内存泄露问题 ...

  3. linux跟踪内存检测原理,wooyun/Linux下基于内存分析的Rootkit检测方法.html at master · exitmsconfig/wooyun · GitHub...

    Linux下基于内存分析的Rootkit检测方法 - 路人甲 原文地址:http://drops.wooyun.org/tips/4731 0x00 引言 某Linux服务器发现异常现象如下图,确定被 ...

  4. Linux 下调用UEFI的函数

    Linux 下调用UEFI的函数 摘要 Linux 调用UEFI function 时候调用约定的转换 64bits calling convention Microsoft calling conv ...

  5. linux下查看内存使用情况

    在Linux下查看内存我们一般用free命令: [root@scs-2 tmp]# free              total       used       free     shared   ...

  6. Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches

    Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches 频繁的文件访问会导致系统的Cache使用量大增 $ free -m total used free shared ...

  7. linux uname内核,Linux下confstr与uname函数_获取C库与内核信息

    Linux下confstr与uname函数_获取C库与内核信息 #include #include  //uname int main(int argc, char **argv[]) { struc ...

  8. 【调试】Linux下超强内存检测工具Valgrind

    [调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Lin ...

  9. Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)

    1.exit()函数 exit(int n)  其实就是直接退出程序, 因为默认的标准程序入口为int main(int argc, char** argv),返回值是int型的. 一般在shell下 ...

最新文章

  1. 让 SVN (TortoiseSVN)提交时忽略bin和obj目录
  2. 矩阵LU分解分块算法实现
  3. java通过System.getProperty获取系统属性
  4. 14-python基础3-数据类型
  5. python打开setting_Django自带日志 settings.py文件配置方法
  6. python获取返回值_python 调用 shell ,获取返回值和返回信息
  7. SQL知识你了解多少?
  8. 11.2.3 退出Vim编辑器
  9. 机器学习代码实战——朴素贝叶斯(实现垃圾邮件分类)
  10. 怎么做好企业网站关键词优化
  11. label怎么换行 vb_VB中怎么换行 | 学步园
  12. 如何对接小发猫的伪原创API
  13. kindle索引_kindle突然全部书卡索引
  14. 你看,那个人好像一条狗啊~30岁以上的程序员该何去何从?
  15. python链家数据分析统计服_链家二手房成交——Python数据分析
  16. 干货 | 超全整理|Python 操作 Excel 库 xlwings 常用操作详解!
  17. 相似度计算之(二)——余弦距离
  18. 关于一些C语言代码优化的方法,我慷慨解囊了大家酌情收藏
  19. html js 打印编辑页眉,js 设置网页打印的页眉页脚和页边距
  20. 三代开源社区的协作模式

热门文章

  1. opencv--车牌识别
  2. 和12岁小同志搞创客开发:拿到一款控制器,要怎么分析?
  3. autoware中lgsvl Simulator安装与使用:LGsvl Simulator 2021.2.1版(九)
  4. Matlab视频流处理:读取,播放,保存
  5. java 读取流的字符编码格式_如何使用Java代码获取文件、文件流或字符串的编码方式...
  6. c#程序设定使用期限_C# 给某个方法设定执行超时时间
  7. 了解Hololens2的硬件信息
  8. 剑指offer:面试题30. 包含min函数的栈
  9. 实验三 Gmapping建图
  10. [综合面试] 计算机面试书籍与求职网站推荐