這一定是一個重復的問題,但我搜索了2天后沒有找到......
我將 MSVC 與 /std:c17 /std:c 17 一起使用,并試圖讓 alignas(64) 與雙精度陣列一起使用。下面代碼中的語法是我發現可以編譯的唯一語法,但它沒有對齊……通常,陣列大約有 75% 的時間未對齊。我知道有很多方法可以使用更復雜的語法來做到這一點,但是有沒有一種方法可以像對結構或類那樣“僅適用于”alignas()?
double* AR;
int count=0, asize=10;
for (int i = 0; i < 1000; i )
{
AR = new double alignas(64)[asize];
if (((uintptr_t)AR & 63) != 0) count ;
//if (((uintptr_t)AR % 64) != 0) count ;
delete[] AR;
}
uj5u.com熱心網友回復:
雖然 C 17 確實可以operator new
為其分配的記憶體提供對齊方式,但 C 中沒有機制來指定由分配的型別對齊之外的new
運算式分配的記憶體的對齊方式。也就是說,如果執行 a或,則分配的指標的對齊方式將為。C 17 添加了基于對齊的分配器,這允許它們支持過度對齊的型別。new T
new T[]
alignof(T)
operator new
如果您可以控制T
并且可以在定義時通過alignas
. 但是,如果您使用其他人的型別或基本型別,例如double
,則無法更改這些型別的對齊方式。所以沒有辦法直接使用new
運算式來分配這樣的記憶體。
您必須::operator new
直接使用以在所需的對齊方式分配足夠的記憶體,然后使用放置new
- 在那里實際創建物件。當然,放置new
在陣列上有很多問題。
我懷疑這只是因為alignas
被認為是一個屬性而編譯,并且[]
在new
運算式中將屬性推到前面是語法上合法的。它并不打算實際作業,因為運算式部分中沒有任何陳述句new
允許它從alignof(T)
.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/388759.html