Вернуть выровненную память с новым?

В настоящее время я выделяю память для массивов, используя MS-mmmmloc. Я выравниваю память, так как занимаюсь тяжелой математикой, а векторизация использует преимущества выравнивания. Мне было интересно, если кто-нибудь знает, как перегрузить новый оператор, чтобы сделать то же самое, так как я чувствую себя грязным malloc'ing везде (и в конечном итоге хотел бы также скомпилировать в Linux)? Спасибо за любую помощь

2 ответа

Решение

Прежде всего, важно отметить, что new а также delete может быть перегружен либо глобально, либо только для одного класса. Оба случая показаны в этой статье. Также важно отметить, что если вы перегружены new Вы почти наверняка также хотите перегрузить delete,

Есть несколько важных замечаний о operator new а также operator delete:

  1. Стандарт C++ требует, чтобы верный указатель возвращался, даже если переданный ему размер равен 0.
  2. Есть также operator new[] а также operator delete[]так что не забывайте о перегрузке.
  3. Производные классы наследуют 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 это скажет вам выравнивание, необходимое для определенного типа.

Другие вопросы по тегам