Что произойдет, если мой пользовательский распределитель памяти Visual C ++ возвращает блок, не выровненный должным образом? - PullRequest
3 голосов
/ 09 декабря 2010

В моей программе Visual C ++ я использую пользовательский operator new, который использует malloc() для выделения памяти. Мой пользовательский operator new сохраняет дополнительные данные в первых 4 байтах памяти и возвращает указатель смещения в качестве начала блока (32-битная программа):

 void* operator new( size_t size )
 {
     size += sizeof( int );//assume it doesn't overflow
     int* result = static_cast<int*>( malloc( size ) );
     if( result == 0 ) {
         throw std::bad_alloc;
     }
     *result = ... //write extra data
     return result + 1;
 }

Теперь, если код вызывающей стороны хочет сохранить переменную размером 64 бита (__int64 или double), блок не будет правильно выровнен для этого.

Какие проблемы это может вызвать в 32-разрядной программе Windows?

1 Ответ

3 голосов
/ 09 декабря 2010

В 32-битных окнах это будет потенциально медленнее, поскольку аппаратное обеспечение может справляться с доступом к невыровненным данным, только медленнее.

В других операционных системах / платформах это может вызвать сбой (или ОЧЕНЬ медленная производительностьтак как ОС ловит доступ к памяти без выравнивания и в некоторых случаях имитирует его для вас)

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