es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe algún atributo de compilador que reordene el contenido de una estructura para un empaquetamiento más eficiente mientras se mantiene una alineación óptima?

Toma las siguientes estructuras, compiladas con gcc 64 bits.

struct A {
  char a;          // tamaño 1
  // 7 bytes de relleno
  long long int i; // tamaño 8
  char b;          // tamaño 1
  // 7 bytes de relleno
}; // tamaño de struct A = 24

struct B {
  char a;          // tamaño 1
  char b;          // tamaño 1
  // 6 bytes de relleno
  long long int i; // tamaño 8
}; // tamaño de struct B = 16

struct __attribute__((packed)) C {
  char a;          // tamaño 1
  long long int i; // tamaño 8
  char b;          // tamaño 1
}; // tamaño de struct C = 10

Todas estas estructuras contienen los mismos tipos. A es la más grande. B reordena su contenido para lograr un tamaño más pequeño. C es aún más pequeña, pero sacrifica la alineación óptima de memoria por ese tamaño.

Obviamente, la alineación de memoria es preferible al realizar la mayoría de las operaciones, pero también es agradable tener un tamaño más pequeño. B elige lo mejor de ambos mundos. Pasar de A a B en este ejemplo es fácil, pero se vuelve un poco molesto trabajar con estructuras más grandes.

Mi pregunta es, ¿existe algún atributo (o algo similar que haga lo mismo) que se pueda agregar a A y que optimice el tamaño reordenando su contenido sin sacrificar la alineación como hace __attribute__((packed))?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hasta donde sé, en C no hay ningún atributo que optimice el tamaño al reordenar el contenido de una estructura sin sacrificar la alineación como lo hace __attribute__((packed)). El atributo packed se utiliza explícitamente con este propósito, para lograr un tamaño más pequeño a expensas de una alineación óptima en memoria.

    La única forma de lograr un tamaño optimizado sin sacrificar la alineación es reordenar manualmente los miembros de la estructura. Sin embargo, esto puede volverse tedioso y propenso a errores para estructuras más grandes, como mencionaste.

    Es importante tener en cuenta que sacrificar la alineación en memoria a favor de un tamaño más pequeño puede generar problemas de rendimiento, ya que puede hacer que las operaciones de la CPU tarden más en completarse. Por lo tanto, el uso de packed debe hacerse con precaución y solo cuando sea absolutamente necesario.

Comments are closed.