возвращать выровненную память с новым? - PullRequest
8 голосов
/ 18 апреля 2010

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

Ответы [ 2 ]

10 голосов
/ 18 апреля 2010

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

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

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

В Действующий 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;
}

Для получения дополнительной информации я бы определенно взял Эффективный C ++ .

2 голосов
/ 18 апреля 2010

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, который сообщит вам выравнивание, необходимое для определенного типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...