Я пишу свою собственную систему памяти в 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;
}
C++ должен знать размер выделенного массива. Это фундаментальный аспект языка. Хотя C++ не указывает, что это должно быть сделано таким образом, это общий подход. Попробуйте написать собственный контейнер-распределитель, а не «новый» распределитель. –
Я не уверен, что понимаю проблему выравнивания, которую вы описываете. C++ требует, чтобы память, возвращаемая 'new', должна быть выровнена по требованиям выравнивания объекта. – templatetypedef
Ну, я написал собственные новые и новые [] операторы, которые заменяют существующие операторы, и я гарантирую, что мои операторы возвращают память с выравниванием, которое мне нужно для создаваемых структур. Моя проблема в том, что C++, похоже, только волшебным образом изменяет возвращаемое значение. –