【发布时间】:2014-02-19 23:40:35
【问题描述】:
我想强制特定的堆分配返回一个 64 字节对齐的地址,因为那是缓存线边界。我以为我可以这样做
int *p = new alignas(64) int;
但我的编译器似乎都没有给 p 一个 64 倍数的地址。这是我正在检查的方式:
#include <iostream>
int main()
{
int *p = new alignas(64) int;
std::cout << long(p) % 64 << '\n'; // should print 0
}
我一定是做错了什么。但是什么?
【问题讨论】:
-
两件事:a) 对过度对齐类型的支持依赖于实现,b) 非常迂腐,您要检查的只是 转换后的值 是否可整除。就语言而言,除了通过新的对齐语言功能外,您没有“指针对齐”的概念。指针不是整数,它们只能与整数相互转换。
-
请注意,我不是在检查指针的对齐方式(即
&p的值),而是在检查它所指向的对齐方式。是的,我同意,我正在检查转换为long的指针的值,但是有没有更好的方法来查看我的对齐请求是否得到满足? -
是的,新的语言功能非常丰富,可能有你需要的东西,例如
std::align。在 C++11 之前,没有对齐内存的标准概念,这就是添加它的原因。您之前必须使用特定于平台的方法。 -
@KeithThompson:我没有将其打印为
long,我正在对其进行算术运算以查看它是否是 64 的倍数。 -
我删除了我的评论。但如果可用,您可能应该转换为
uintptr_t(在<cstdint>中声明)。在某些实现中,int*大于long。
标签: c++ c++11 memory-alignment