2017-02-09 66 views
2

如何使用malloc(或new,因爲在大多數實現中,new是使用malloc實現的,不確定標準中關於對齊方式和除數據以外的其他新對象必須與最高標量對齊)與對齊要求設置爲高於系統上的最大對齊要求(alignof(std::max_align_t))的類型?因此,像內存對齊高於最大對齊比較alignas malloc

alignas(alignof(std::max_align_t) + alignof(int)) struct Something { 
    ... 
}; 
+0

讓'N'表示需要對齊(太糟糕了,你沒有提到的是,在問題;將使它更容易回答這個問題) 。只需用'n + sizeof(struct Something)'調用'malloc',然後從'malloc'返回的值開始尋找一個對齊的地址。你保證在'[retVal,retVal + n-1]'之間找到這樣的有效地址。然後用它作爲你的結構的基地址。 –

+0

@barakmanos這是一個聰明的黑客大聲笑,有沒有圖書館的解決方案呢?我想C不必擔心這個問題,因爲沒有對齊要求高於最大標量要求 – Curious

+0

我相信任何供應商都必須提供適用於支持平臺(編譯器+底層硬件架構)的'malloc'。 –

回答

0

將評論轉換爲答案。

ALIGNMENT表示所需的對齊。

然後你就可以放心地分配你的結構如下:

char* buffer = new char[ALIGNMENT+sizeof(Something)]; 
uintptr_t address = reinterpret_cast<uintptr_t>(buffer); 
uintptr_t aligned_address = address+ALIGNMENT-address%ALIGNMENT; 
Something* something = reinterpret_cast<Something*>(aligned_address);