Estoy sobrecargando operator new
, pero recientemente tuve un problema con la alineación. Básicamente, tengo una clase IBase
que proporciona operator new
y delete
en todas las variantes requeridas. Todas las clases derivan de IBase
y, por lo tanto, también usan los asignadores personalizados.operador nueva sobrecarga y alineación
El problema que estoy enfrentando ahora es que tengo un hijo Foo
que tiene que estar alineado 16 bytes, mientras que todos los demás están bien cuando se alinean a 8 bytes. Sin embargo, mi asignador de memoria se alinea con los límites de 8 bytes de forma predeterminada, por lo que ahora el código en IBase::operator new
devuelve una pieza de memoria inutilizable. ¿Cómo se supone que esto se resuelva correctamente?
Puedo simplemente forzar todas las asignaciones a 16 bytes, lo que funcionará bien hasta que aparezca un tipo alineado de 32 bytes. Averiguar la alineación dentro de operator new
no parece ser trivial (¿puedo hacer una llamada de función virtual allí para obtener la alineación real?) ¿Cuál es la forma recomendada de manejar esto?
Sé que se supone que malloc
devuelve una pieza de memoria que está adecuadamente alineada para todo, desafortunadamente, este "todo" no incluye tipos de SSE y realmente me gustaría hacerlo funcionar sin requerir que el usuario recuerde qué tipo tiene qué alineación.
Quizás podría utilizar un IBase (IBase16?) Diferente para los pocos objetos que tienen requisitos de alineación especiales. –
Incluso podría crear esta clase base (IBase16, IBase32) con plantilla, por lo que podría usar IBase. –
Patrick
Puede alinear los límites de 64 bytes. :) – Bill