目录

posix_memalign

opencv中的内存对齐函数源码


posix_memalign

预对齐内存的分配

在大多数情况下,编译器和C库透明地帮你处理对齐问题。POSIX 标明了通过malloc( )calloc( ), 和 realloc( ) 返回的地址对于任何的C类型来说都是对齐的。在Linux中,这些函数返回的地址在32位系统是以8字节为边界对齐,在64位系统是以16字节为边界对齐的。有时候,对于更大的边界,例如页面,程序员需要动态的对齐。虽然动机是多种多样的,但最常见的是直接块I/O的缓存的对齐或者其它的软件对硬件的交互,因此,POSIX 1003.1d提供一个叫做posix_memalign( )的函数:

/* one or the other -- either suffices */
#define _XOPEN_SOURCE 600
#define _GNU_SOURCE
#include <stdlib.h>
int posix_memalign (void **memptr,size_t alignment,size_t size);* See http://perens.com/FreeSoftware/ElectricFence/ and http://valgrind.org, respectively.
调用posix_memalign( )成功时会返回size字节的动态内存,并且这块内存的地址是alignment的倍数。参数alignment必须是2的幂,还是void指针的大小的倍数。返回的内存块的地址放在了memptr里面,函数返回值是0.调用失败时,没有内存会被分配,memptr的值没有被定义,返回如下错误码之一:
EINVAL
参数不是2的幂,或者不是void指针的倍数。
ENOMEM
没有足够的内存去满足函数的请求。
要注意的是,对于这个函数,errno不会被设置,只能通过返回值得到。由posix_memalign( )获得的内存通过free( )释放。用法很简单:
char *buf;
int ret;
/* allocate 1 KB along a 256-byte boundary */
ret = posix_memalign (&buf, 256, 1024);
if (ret) {fprintf (stderr, "posix_memalign: %s\n",strerror (ret));return -1;
}
/* use 'buf'... */
free (buf);与对齐有关的问题的范围要超过标准类型的自然对齐和动态存储器地分配。例如,非标准和复杂的类型比标准类型有更复杂的要求。另外,对对齐的关注在给指向不同类型的指针赋值和使用强转时显得加倍的重要。非标准类型。非标准和复杂的数据类型的对齐比简单的自然对齐有着更多的要求。这里四个有很有用的方法:
•一个结构的对齐要求是和它的成员中最大的那个类型一样的。例如,一个结构中最大的是以4字节对齐的32bit的整形,那么这个结构至少以4字节对齐。
•结构也引入了填充的需要,用来保证每一个成员都符合自己的对齐要求。所以,如果一个char (可能以1字节对齐)后跟着一个int (可能以4字节对齐),编译器会自动地插入3个字节作为填充来保证int以4字节对齐。
程序员有时候排列结构里面的成员-例如,以大小来递减-来是使用作填充的垃圾空间最少。GCC的选项- Wpadded能对这些努力有帮助,因为它使得在编译器偷偷插入填充时产生警告。
•一个联合的对齐和联合里最大的类型一样。
•一个数组的对齐和数组里的元素一样。所以,数组的对齐并不比单单的一个成员严格,这样能使数组里面的所有成员都是自然对齐的。

其他平台的内存对齐函数雷同:如win32系统函数:_aligned_malloc(size, alignment),android系统函数:memalign(alignment, size)

opencv中的内存对齐函数源码(ncnn写法也一样,应该是参考opencv)

template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n = (int)sizeof(_Tp))
{assert((n & (n - 1)) == 0); // n is a power of 2return (_Tp*)(((size_t)ptr + n - 1) & -n);
}void* fastMalloc(size_t size)
{unsigned char* udata = (unsigned char*)malloc(size + sizeof(void*) + CV_MALLOC_ALIGN);if (udata){unsigned char** adata = alignPtr((unsigned char**)udata + 1, CV_MALLOC_ALIGN);/*保存原始的内存地址,adata是对齐后的地址,若直接释放这个地址,则会产生内存泄露。malloc得到的指针地址保存在adata的前一块区域内*/adata[-1] = udata;return adata;}return NULL;
}void fastFree(void* ptr)
{if (ptr){unsigned char* udata = ((unsigned char**)ptr)[-1];assert(udata < (unsigned char*)ptr &&((unsigned char*)ptr - udata) <= (std::ptrdiff_t)(sizeof(void*) + CV_MALLOC_ALIGN));free(udata);}
}

CV_MALLOC_ALIGN为需要对齐的bit数

内存对齐指令详解(posix_memalign)相关推荐

  1. arm-linux-ld中的参数,arm-linux-ld指令详解

    arm-linux-ld指令详解 我们对每个c或者汇编文件进行单独编译,但是不去连接,生成很多.o 的文件,这些.o文件首先是分散的,我们首先要考虑的如何组合起来:其次,这些.o文件存在相互调用的关系 ...

  2. pragma comment的使用 pragma预处理指令详解

    pragma comment的使用 pragma预处理指令详解 #pragma comment( comment-type [,"commentstring"] ) 该宏放置一个注 ...

  3. #pragma comment和#pragma 预处理指令详解

    该宏放置一个注释到对象文件或者可执行文件. 例如,#pragma   comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库. 和在工程设置里写上链入 ...

  4. Unreal3 window下内存管理实现详解

    Unreal3 window下内存管理实现详解 最近组里面同事加入了一个很牛叉的内存管理代码,勾起我对内存管理的强烈欲望,以前也做过内存管理,在没有遇到U3以前看了3,4种算法(C++游戏编程 这本书 ...

  5. C语言字节对齐问题详解

    转载原文连接:https://www.cnblogs.com/clover-toeic/p/3853132.html C语言字节对齐问题详解 引言 考虑下面的结构体定义: 1 typedef stru ...

  6. 九爷带你了解 nginx 日志配置指令详解

    nginx日志配置指令详解 日志对于统计排错来说非常有利的. 本文总结了nginx日志相关的配置如 access_log.log_format.open_log_file_cache.log_not_ ...

  7. Java 内存模型 JMM 详解

    转载自 Java 内存模型 JMM 详解 JMM简介 Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性.是否可以重排序等问题的无关具体 ...

  8. #pragma预处理指令详解

    #pragma预处理指令详解 在所有的预处理指令中,#Pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保 ...

  9. Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解

    前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY  <源路径> .. ...

最新文章

  1. TYVJ P1091 等差数列 Label:dp
  2. GPLinker:基于GlobalPointer的事件联合抽取
  3. 关于编程思想的一点思考
  4. 浅析 Linux 初始化 init 系统,第 3 部分: Systemd
  5. 2016全球可再生能源投资额为2416亿美元
  6. 使用DistroTweaks复制您的自定义Linux设置
  7. 资源放送丨《一次特殊的Oralce硬解析性能问题的技术分享》PPT视频
  8. K-means均值聚类算法的原理与实现
  9. 超轻量级PHP框架BroPHP
  10. 最新最全的vue面试题+详细解答
  11. 1-2 图片批量裁剪
  12. pandas使用dataframe的索引和数据列同时对dataframe数据进行排序、使用ascending参数指定索引和数据列的排序方向(升序或者降序)
  13. 【SpringSecurity】SpringSecurity2.7.x 的使用(03)
  14. 论文解读:《Deep-4mcw2v: 基于序列的预测器用于识别大肠桿菌中的 N4- 甲基胞嘧啶(4mC)位点》
  15. opencv 显示无边框
  16. ios降级鸿蒙,iOS 降级 13.3 系统方法,你成功了没
  17. 【Java】装箱拆箱
  18. 《流畅的python》学习笔记之python是什么类型的语言?
  19. (递推)常用递推式总结及实现
  20. 【Practical】随机过程

热门文章

  1. squirrelsql安装
  2. 被调用的对象已与其客户端断开连接
  3. Longest Palindromic Substring
  4. 实现Evernote的OAuth授权
  5. Object-C 入门
  6. 《C程序设计语言》(第二版)要点总结
  7. 汇编基础知识之输入输出
  8. Python之值得学习练手的22个迷你程序(附代码)
  9. 2018年第九届蓝桥杯 - 省赛 - C/C++大学B组 - F.递增三元组
  10. Django Rest Framework 视图和路由