【发布时间】:2015-06-19 15:16:25
【问题描述】:
我正在尝试分配一个结构数组,我希望每个结构都对齐到 64 个字节。
我试过这个(它现在只适用于 Windows),但它不起作用(我用 VS2012 和 VS2013 试过):
struct __declspec(align(64)) A
{
std::vector<int> v;
A()
{
assert(sizeof(A) == 64);
assert((size_t)this % 64 == 0);
}
void* operator new[] (size_t size)
{
void* ptr = _aligned_malloc(size, 64);
assert((size_t)ptr % 64 == 0);
return ptr;
}
void operator delete[] (void* p)
{
_aligned_free(p);
}
};
int main(int argc, char* argv[])
{
A* arr = new A[200];
return 0;
}
断言((size_t)this % 64 == 0) 中断(模返回16)。如果结构只包含简单类型,它看起来似乎有效,但是当它包含 std 容器(或其他一些 std 类)时会中断。
我做错了吗?有没有办法正确地做到这一点? (最好兼容 c++03,但任何适用于 VS2012 的解决方案都可以)。
编辑: 正如 Shokwav 所暗示的,这很有效:
A* arr = (A*)new std::aligned_storage<sizeof(A), 64>::type[200];
// this works too actually:
//A* arr = (A*)_aligned_malloc(sizeof(A) * 200, 64);
for (int i=0; i<200; ++i)
new (&arr[i]) A();
所以看起来它与 new[] 的使用有关......我很好奇是否有人有解释。
【问题讨论】:
-
在您进行编辑之后,您实际上是在调用“放置”新运算符,它确实有效(显然)。但是,这可能会泄漏,因为没有代码会为数组中的每个项目调用 A 的析构函数,即使您调用“free(arr)”或“delete arr”
-
没关系,我会手动调用析构函数:
arr[i].~A()
标签: c++ memory-alignment