- 主题:aligned_allocator到底做了什么?
这几天调试bug,发现使用std::vector<int,aligned_allocator<int>> var,运行后结果是对的,但是使用std::vector<int> var,运行结果就是错的,请问aligned_allocator起了什么作用?google了半天也没发现具体解释。
--
FROM 114.246.150.*
你好,对齐的内存地址怎么理解?vector本身就是连续内存,int又是32bit,我不太理解还需要怎么对齐。
【 在 z16166 的大作中提到: 】
: 可以单步跟进去看的。
: 顾名思义,就是返回对齐的内存地址。有些API或者OS机制需要提供对齐的地址,不然就会返回失败。
: 通常是调用编译器提供的intrinsic函数。或者多分配一点内存,在分配的这段内存中从头开始找到对齐的那个地址,返回那个地址即可。
: ...................
--
FROM 114.246.150.*
就是返回的地址的值的 低 x bits 都是 0,这就叫对齐。
比如 DWORD-aligned, 就是说,地址值能被 4 整除。
某些 cpu 指令,对地址的对齐有要求。
【 在 happybamboo (大色魔) 的大作中提到: 】
: 你好,对齐的内存地址怎么理解?vector本身就是连续内存,int又是32bit,我不太理解还需要怎么对齐。
--
修改:hoodlum FROM 211.95.56.*
FROM 211.95.56.*
比如,有些操作需要页面对齐,假如内存页面大小是4096字节,那么传递给API(或者说成传给os/硬件)的buffer首地址必须是4096的整数倍。这就是内存地址对齐。
【 在 happybamboo 的大作中提到: 】
: 你好,对齐的内存地址怎么理解?vector本身就是连续内存,int又是32bit,我不太理解还需要怎么对齐。
--
FROM 123.118.188.*
看明白了,多谢
【 在 z16166 的大作中提到: 】
: 比如,有些操作需要页面对齐,假如内存页面大小是4096字节,那么传递给API(或者说成传给os/硬件)的buffer首地址必须是4096的整数倍。这就是内存地址对齐。
:
--
FROM 114.246.150.*
谢谢,看懂了。
【 在 hoodlum 的大作中提到: 】
: 就是返回的地址的值的 低 x bits 都是 0,这就叫对齐。
: 比如 DWORD-aligned, 就是说,地址值能被 4 整除。
: 某些 cpu 指令,对地址的对齐有要求。
: ...................
--
FROM 114.246.150.*
这两个资料可以进一步参考一下
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.*
LZ的例子是vector<int>, 奇怪的是对于int的动态内存(数组)分配还能是不对齐的? 一般来说对齐都是对齐到int类型的长度吧比如4字节对齐。
--
FROM 1.91.32.*
作用就是开辟出来的内存是对齐的啊…
有些地方要求对齐的内存,比如SIMD指令。
【 在 happybamboo () 的大作中提到: 】
: 这几天调试bug,发现使用std::vector<int,aligned_allocator<int>> var,运行后结果是对的,但是使用std::vector<int> var,运行结果就是错的,请问aligned_allocator起了什么作用?google了半天也没发现具体解释。
--
FROM 203.145.95.*