我想強制一個特定的堆分配返回一個64字節對齊的地址,因爲這是一個緩存行邊界。我想我可以做這樣的如何使用alignof爲堆分配強制對齊?
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
}
我必須做有問題。但是什麼?
兩件事情:一)overaligned類型的支持是實現相關,和b )非常迂迴,你要檢查的是*轉換值*是否可分。就語言而言,除了通過新的對齊語言功能之外,您沒有「對齊指針」的概念。指針不是整數,只能轉換爲整數。 –
請注意,我沒有檢查指針的對齊方式(這將是'&p'的值),我正在檢查它指向的對齊方式。是的,我同意,我正在檢查轉換爲「long」的指針的值,但有沒有更好的方法來查看我的對齊請求是否正在實現? – KnowItAllWannabe
是的,新的語言功能非常豐富,可能有你需要的,例如, ['的std :: align'](http://en.cppreference.com/w/cpp/memory/align)。在C++ 11之前,簡單的*並不是*對齊內存的標準概念,這就是它被添加的原因。之前必須使用特定於平臺的方法。 –