Я перегружаю operator new
, но недавно я столкнулся с проблемой выравнивания. В принципе, у меня есть класс IBase
, который предоставляет operator new
и delete
во всех необходимых вариантах. Все классы производятся от IBase
и, следовательно, также используют пользовательские распределители.
Проблема, с которой я сейчас сталкиваюсь, состоит в том, что у меня есть дочерний элемент Foo
, который должен быть выровнен по 16 байт, а все остальные - в порядке, когда выровнены с 8-байтовым. Однако мой распределитель памяти выравнивается по 8-байтовым границам только по умолчанию, поэтому теперь код в IBase::operator new
возвращает непригодную часть памяти. Как это должно быть правильно решено?
Я могу просто форсировать все выделения до 16 байтов, которые будут работать нормально до тех пор, пока не выскочит 32-байтовый выровненный тип. Выяснить, что выравнивание внутри operator new
не кажется тривиальным (могу ли я сделать виртуальную функцию для получения фактического выравнивания?) Какой рекомендуемый способ справиться с этим?
Я знаю, что malloc
должен вернуть часть памяти, которая соответствующим образом выровнена для всего, к сожалению, это "все" не включает типы SSE, и мне бы очень хотелось, чтобы эта работа работала, не требуя от пользователя помните, какой тип имеет выравнивание.