2016-03-17 26 views
4

我正在C++編寫我自己的內存系統(出於性能原因,附加的調試信息以及我可以分配16字節對齊的內存)和I我遇到了新問題[]。C++強制new []不分配4個字節

看來,調用new []會導致分配額外的4個字節,表示數組中元素的數量,這會拋出所有後續對象的對齊。所以我的問題是:有沒有辦法通過編譯器標誌,雜注聲明等來關閉這4個額外字節的使用?

下面是一個例子:

// Matrix class has to be 16-byte aligned 
Matrix* transforms = new(matrixHeap, ALIGN_16, __FILE__, __LINE__) Matrix[31]; 
transforms[0] = Matrix::Identity; 

當在Visual Studio 2013調試器看,我看到這些值:

returned by new 0x0F468840 
transforms   0x0F468844 

最後,我走在原始內存偷看,我看到此:

0x0F468840 1F 00 00 00 
0x0F468844 01 00 00 00 

在****** 40不transforms[0]作爲第一值的存儲器預期。相反,它包含值31。這意味着矩陣只有4字節對齊。有什麼辦法可以關閉這個數組大小的事務,以便transforms[0]的第一個字節結尾在由new []返回的地址中?

這裏是我操作的重要位新[]:

void* operator new[] (size_t size, Heap* heap, uint32_t alignment, char* file, int lineNumber) 
{ 
    size_t alignedSize = size + alignment - 1; 
    void* unalignedPtr = heap->Allocate(alignedSize); 
    void* alignedPtr = (void*) (((size_t) unalignedPtr + alignment - 1) & ~(alignment - 1)); 
    return alignedPtr; 
} 
+0

C++需要知道分配數組的大小。這是該語言的基本方面。儘管C++沒有規定它必須以這種方式完成,但這是一種常用的方法。嘗試編寫一個自定義容器分配器,而不是'new'分配器。 –

+1

我不確定我是否理解你描述的對齊問題。 C++要求'new'返回的內存必須按照對象的對齊要求進行對齊。 – templatetypedef

+0

那麼,我寫了自定義的新的和新的[]運算符來替換現有的運算符,並且我確保我的運算符返回的內存符合我創建的結構所需的對齊方式。我的問題是,C++似乎只是奇蹟般地改變返回的值。 –

回答

0

因爲它似乎一直使用4個字節的大小,你可以只爲您安排operator new[]函數返回比16少4字節對齊的地址。你仍然希望operator new直接返回一個16字節對齊的地址。