Вернуть выровненную память с новым?
В настоящее время я выделяю память для массивов, используя MS-mmmmloc. Я выравниваю память, так как занимаюсь тяжелой математикой, а векторизация использует преимущества выравнивания. Мне было интересно, если кто-нибудь знает, как перегрузить новый оператор, чтобы сделать то же самое, так как я чувствую себя грязным malloc'ing везде (и в конечном итоге хотел бы также скомпилировать в Linux)? Спасибо за любую помощь
2 ответа
Прежде всего, важно отметить, что new
а также delete
может быть перегружен либо глобально, либо только для одного класса. Оба случая показаны в этой статье. Также важно отметить, что если вы перегружены new
Вы почти наверняка также хотите перегрузить delete
,
Есть несколько важных замечаний о operator new
а также operator delete
:
- Стандарт C++ требует, чтобы верный указатель возвращался, даже если переданный ему размер равен 0.
- Есть также
operator new[]
а такжеoperator delete[]
так что не забывайте о перегрузке. - Производные классы наследуют
operator new
и его братья, так что не забудьте переопределить их.
В Effective C++, пункт 8, Скотт Мейерс включает несколько псевдокодовых примеров:
void * operator new(size_t size) // your operator new might
{ // take additional params
if (size == 0) { // handle 0-byte requests
size = 1; // by treating them as
} // 1-byte requests
while (1) {
attempt to allocate size bytes;
if (the allocation was successful)
return (a pointer to the memory);
// allocation was unsuccessful; find out what the
// current error-handling function is (see Item 7)
new_handler globalHandler = set_new_handler(0);
set_new_handler(globalHandler);
if (globalHandler) (*globalHandler)();
else throw std::bad_alloc();
}
}
void operator delete(void *rawMemory)
{
if (rawMemory == 0) return; // do nothing if the null
// pointer is being deleted
deallocate the memory pointed to by rawMemory;
return;
}
Для получения дополнительной информации я бы определенно взял Effective C++.
new
требуется вернуть pointer [...] suitably aligned so that it can be converted to a pointer of any complete object type
(§3.7.3.1 стандарта).
FWIW, C++ 0x добавит alignof
это скажет вам выравнивание, необходимое для определенного типа.