我正在尝试实现自定义分配器以与 std 容器配合使用,具体要求在此处:
https://en.cppreference.com/w/cpp/named_req/Allocator
我目前正在尝试实现一个线性分配器,但是在内存对齐方面遇到了困难。
在分配了一块内存后,我想知道每个对象之间需要多少填充,以优化 CPU 的读写。
我不确定地址对齐是否应该是可被以下内容整除:
- CPU 字长(32 位机器上的 4 个字节和 64 位机器上的 8 个字节) -
“通常的经验法则(直接从英特尔和 AMD 的优化手册中得出)是每种数据类型都应该按其自身大小对齐。int32 应该在 32 位边界上对齐,int64 在 64 位边界上对齐,等等。char 在任何位置都可以适合。”
因此,根据这个答案,地址对齐看起来应该是可以被
在 这个 问题中,第二个答案说明:
“CPU 总是按照其字长读取(32 位处理器上为 4 字节),因此当您进行非对齐地址访问时,在支持它的处理器上,处理器将读取多个字。”
因此,根据这个答案,地址对齐看起来应该是可被 CPU 字长整除的。
因此,我看到了一些关于如何优化数据对齐以进行 CPU 读写的冲突陈述,不确定是否理解有误或是否存在错误的答案?也许有人可以为我澄清地址对齐应该被以下内容整除。
- CPU 字长(32 位机器上的 4 个字节和 64 位机器上的 8 个字节) -
sizeof(T)
- alignof(T)
我在不同的地方阅读到了不同的答案。
例如,在 这个 问题中,被接受的答案说:“通常的经验法则(直接从英特尔和 AMD 的优化手册中得出)是每种数据类型都应该按其自身大小对齐。int32 应该在 32 位边界上对齐,int64 在 64 位边界上对齐,等等。char 在任何位置都可以适合。”
因此,根据这个答案,地址对齐看起来应该是可以被
sizeof(T)
整除的。在 这个 问题中,第二个答案说明:
“CPU 总是按照其字长读取(32 位处理器上为 4 字节),因此当您进行非对齐地址访问时,在支持它的处理器上,处理器将读取多个字。”
因此,根据这个答案,地址对齐看起来应该是可被 CPU 字长整除的。
因此,我看到了一些关于如何优化数据对齐以进行 CPU 读写的冲突陈述,不确定是否理解有误或是否存在错误的答案?也许有人可以为我澄清地址对齐应该被以下内容整除。
sizeof(T)
吗? - undefinedsizeof(T)
可能是3个字节,这取决于类型,所以是的,请按照CPU字大小对齐。不过,如果你正在处理大块数据的副本,对齐到页面大小会更好。 - undefinedm_Alignment = sizeof(T*)
,对吗? 如果我按照4字节或8字节(取决于CPU字长)对齐,那么如果第一个地址可被4/8整除,是否总会有0填充?如果是这样的话,如果我能保证起始地址可被4/8整除,那么是否可以优化以确保在池中容纳更多的对象?如果是这样的话,我如何使用malloc来保证这种地址划分呢? - undefined