Busco una respuesta definitiva (si es que existe uno) de la cantidad de memoria debe asignarse al crear unos trozos estáticos de memoria compartida a través de boost::interprocess
's managed_shared_memory
. Incluso official examples parecen asignar arbitrarily large trozos de memoria.¿Cuánta memoria debe asignar 'managed_shared_memory'? (Impulso)
Considérese la siguiente estructura:
// Example: simple struct with two 4-byte fields
struct Point2D {
int x, y;
};
Mi reacción inicial es que el tamaño necesario sería de 8 bytes, o sizeof(Point2D)
. Esto falla miserablemente cuando intento construir un objeto, dándome seg-faults en tiempo de ejecución.
// BAD: 8 bytes is nowhere near enough memory allocated.
managed_shared_memory segment(create_only, "My shared memory", sizeof(Point2D));
¿Qué operación de lectura/escritura está causando seg-faults? Operaciones de pila? ¿Asignaciones temporales dentro de segment.construct()
? ¿Cuánta sobrecarga es necesaria al asignar memoria compartida?
Por prueba y error Descubrí que multiplicar el tamaño por 4 puede funcionar para la estructura anterior, pero se desmorona cuando empiezo a agregar más campos a mi struct
. Entonces, eso apesta a un hack malo.
Algunos podrían argumentar que "la memoria es barata" en la PC moderna, pero estoy en desacuerdo con esta filosofía y no me gusta asignar más de lo que necesito, si puedo evitarlo. Cavé alrededor de los documentos de Boost ayer y no pude encontrar ninguna recomendación. ¡Aquí hay algo de aprendizaje hoy!
La gente puede estar en desacuerdo conmigo aquí, pero nunca en mi vida he codificado la frase "la memoria es barata". Comprar memoria no es necesariamente caro comparado con lo que solía ser, pero se parece mucho al dinero. Cuanto más tienes, más gastas. Cada actualización de memoria que compré para mi computadora, ya me he agotado bastante rápido ahora que puedo "ejecutar más cosas". Siempre he tratado de codificar de manera conservadora a este respecto porque no es necesariamente barato * para mi aplicación *. De todos modos, solo mi 2c en eso :) –
Estoy de acuerdo 100%! Y ese es el motivo ** completo ** por el que hago esta pregunta. Solo lancé ese comentario para disuadir a cualquiera que dijera "a quién le importa, solo asigne 1k y termine con eso". Trataré de dejarlo más claro en la publicación. –
Ah ok :) "Algunos podrían argumentar" ¡es mucho mejor! –