2016-03-17 3 views
4

Я пишу свою собственную систему памяти в C++ (по соображениям производительности, дополнительной информации отладки и так, что я могу выделить память с выравниванием по 16 байт), и я я столкнулся с проблемой с новым [].C++ force new [], чтобы не выделять 4 дополнительных байта

Кажется, что вызов new [] приводит к распределению дополнительных 4 байтов, указывающих количество элементов в массиве, что сбрасывает выравнивание всех последующих объектов. Поэтому мой вопрос таков: есть ли способ отключить использование этих 4 дополнительных байтов с флагом компилятора, объявлением pragma и т. Д.?

Вот пример:

// 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] попал в адрес, возвращенный новым []?

Вот важные биты моего оператора новый []:

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++ не указывает, что это должно быть сделано таким образом, это общий подход. Попробуйте написать собственный контейнер-распределитель, а не «новый» распределитель. –

+1

Я не уверен, что понимаю проблему выравнивания, которую вы описываете. C++ требует, чтобы память, возвращаемая 'new', должна быть выровнена по требованиям выравнивания объекта. – templatetypedef

+0

Ну, я написал собственные новые и новые [] операторы, которые заменяют существующие операторы, и я гарантирую, что мои операторы возвращают память с выравниванием, которое мне нужно для создаваемых структур. Моя проблема в том, что C++, похоже, только волшебным образом изменяет возвращаемое значение. –

ответ

0

Так как кажется, последовательно использовать 4 байта для размера, вы могли бы просто организовать для operator new[] функции для возврата 4 меньше, чем 16 -byte выровненный адрес. Вы все равно хотите, чтобы operator new сразу возвращал 16-байтовый выровненный адрес.

 Смежные вопросы

  • Нет связанных вопросов^_^