水木社区手机版
首页
|版面-C++程序设计语言(CPlusPlus)|
新版wap站已上线
返回
1/1
|
转到
主题:aligned_allocator到底做了什么?
1楼
|
z16166
|
2020-04-02 10:54:31
|
展开
可以单步跟进去看的。
顾名思义,就是返回对齐的内存地址。有些API或者OS机制需要提供对齐的地址,不然就会返回失败。
通常是调用编译器提供的intrinsic函数。或者多分配一点内存,在分配的这段内存中从头开始找到对齐的那个地址,返回那个地址即可。
参考:
https://johanmabille.github.io/blog/2014/12/06/aligned-memory-allocator/
--
FROM 123.118.188.*
4楼
|
z16166
|
2020-04-02 11:20:53
|
展开
比如,有些操作需要页面对齐,假如内存页面大小是4096字节,那么传递给API(或者说成传给os/硬件)的buffer首地址必须是4096的整数倍。这就是内存地址对齐。
【 在 happybamboo 的大作中提到: 】
: 你好,对齐的内存地址怎么理解?vector本身就是连续内存,int又是32bit,我不太理解还需要怎么对齐。
--
FROM 123.118.188.*
7楼
|
z16166
|
2020-04-02 11:36:58
|
展开
这两个资料可以进一步参考一下
Intel编译器的对齐优化(普通变量对齐主要是为了cpu bus和cache优化)
https://software.intel.com/en-us/articles/coding-for-performance-data-alignment-and-structures
windows kernel driver对于应用层传递来的参数的地址对齐检查
https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/avoiding-misalignment-of-fixed-precision-data-types
--
修改:z16166 FROM 123.118.188.*
FROM 123.118.188.*
15楼
|
z16166
|
2020-04-02 20:39:44
|
展开
有些场景下不仅仅要求2/4/8/16字节对齐,可能是要求按磁盘扇区大小对齐、按内存页面大小对齐等等。
比如外设的DMA数据传输、文件的direct I/O(win/linux都有这种模式,linux可以搜一下O_DIRECT,win下搜FILE_FLAG_NO_BUFFERING)
楼主这个在上面回答了,是和FPGA外设的bulk数据传输。
【 在 hongdiao 的大作中提到: 】
: LZ的例子是vector<int>, 奇怪的是对于int的动态内存(数组)分配还能是不对齐的? 一般来说对齐都是对齐到int类型的长度吧比如4字节对齐。
--
FROM 123.118.188.*
1/1
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版