| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 【学习体会】aligned_malloc实现内存对齐 -> 正文阅读 |
|
[C++知识库]【学习体会】aligned_malloc实现内存对齐 |
什么是内存对齐?有两种解释:
对于2,举个最简单的例子:
理论上,32位系统下,int占4byte,char占一个byte,那么将它们放到一个结构体中应该占4+1=5byte;但是实际上,通过运行程序得到的结果是8 byte,这是编译器自动进行了内存对齐。 而我们想要说的是第 1 种解释:
?大家都知道C++中可以直接调用malloc请求内存被返回分配成功的内存指针,该指针指向的地址就是分配得到的内存的起始地址。比如,在VS中选择x86平台,该平台是针对32位系统进行编译的,
在请求了一个大小为1024的内存块并打印出来,但是这块内存的地址并不是32的倍数。
那么为什么要内存对齐32字节呢? 因为我们如果用到了simd256技术的话,simd一种单指令多数据的数据,而256就是指同时操作256bit的数据,而256bit=32byte。因此simd256技术要求所操作的数据的首地址是内存对齐32字节。 这样的话,原先的malloc就不够用了,因为它不能分配给我们内存对齐于32字节的。 在网上一直有下面这个aligned_malloc的实现,不知道具体出处,本文对这个函数进行详细分析, 先看具体实现:
假设我们需要开辟一块内存,字节数为size,如果使用malloc,那么返回的内存指针为raw,这个指针指向的地址不一定是32的倍数,因此我们需要多一点,比如多alignment – 1 + pointerSize ? ?requestedSize就是我们为了能够内存对齐而申请的内存大小,会比实际需要的内存多alignment – 1 + pointerSize。alignment是对齐量,比如32;pointerSize是指针类型占内存的字节数(简单说就是存放一个指针需要多少个字节),这个通常和电脑操作系统和编译器有关。 这段代码解决的问题就是,在这个大小为requestedSize的内存块内,找到对齐32的地址并返回。 解决方法如图: 其中的aligned就是对齐32的地址。
据代码的作者说,这是来自《Hacker's Delight》,早期STL也是这么实现的。 同时,非常重要的一点是,后续怎么释放掉这一块内存,
?在aligned的左边pointerSize的位置,存放raw指针,这样后续我们就可以用 ((void**)aligned_ptr)[-1]?获取到raw指针,从而可以调用free对内存继续释放。
最后,代码作者也给出判断地址是否对齐的算法:
? 参考博文: aligned_malloc及aligned_free的实现及详细解释_John_Jane_Doe的博客-CSDN博客_aligned_malloc |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 7:46:30- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |