我想分配一個結構數組,我希望每個結構對齊到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類)時破壞。
我做錯了什麼?有沒有辦法做到這一點? (最好是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();
因此,它看起來像它涉及到使用新的[] ...我很好奇,如果任何人有一個解釋。
http://en.cppreference.com/w/cpp/types/aligned_storage(C++ 11) – Shokwav
按照你的編輯,你實際上調用「放置」新的運營商,它不工作(明顯)。然而,這很可能會流失,因爲沒有代碼,會調用A的析構函數數組中的每一項,即使你所說的「免費(ARR)」或「刪除ARR」 – xryl669
這很好,我會打電話的析構函數手動:'arr [i]。〜A()' – Jerem