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