Errores, fallos, preguntas - página 2503

 
Alexey Viktorov:

Entonces, ¿cuál es el error?

Declaras un array de dos elementos con dos bytes cada uno y obtienes 4 bytes como debería ser. ¿Dónde está el bicho? ¿Qué es?

Es esto.

Lo alineas a 4 y 2 elementos ocuparán 2*8 bytes.

Lo siento, pero si escribes eso, no entiendes el tema.

Análogo a las cruces:

#include <iostream>
struct alignas(4) A
{
  short j;
};

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 8
   return 0;
}

¿El error probablemente no está aquí?

 
Vict:

Lo siento, pero si escribes eso, no entiendes el tema.

No, parece que no lo entiendes.

//g++  5.4.0

#include <iostream>
#pragma  pack (push, 4)
struct A
{
  short j;
};
#pragma  pack (pop)

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 4
   return 0;
}
 
TheXpert:

No, parece que no lo entiendes.

El paquete #pragma de las cosas de smallmicrosoft es una cosa muy peculiar (el funcionamiento actual me sorprende, la verdad). No es de extrañar que las alineas estándar funcionen de forma diferente.

Aquí hay más:

#include <iostream>
struct A
{
  short j;
} __attribute__((aligned(4)));

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 8
   return 0;
}
 
Vict:

El paquete #pragma de los pequeños softwares es una cosa muy peculiar (su funcionamiento me sorprende ahora, la verdad). No es de extrañar que las alineaciones funcionen de forma diferente en la norma.

vamos )

#include <iostream>
struct A
{
  short j;
} alignas(4) ;

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 4
   return 0;
}

#pragma pack funciona bien en gcc también, y lo que escribiste es sólo un atributo interno de gcc que funciona de manera diferente a la alineación.

 
TheXpert:

Vamos, ya).

#pragma pack funciona bien en gcc también, y lo que escribiste es sólo un atributo interno de gcc que no funciona de la misma manera que alineado.

¿Qué muestra este ejemplo? ¿Que no te has dado cuenta del uso de las alineas? Incluso el compilador jura el código:

1.cc:7:3: warning: attribute ignored in declaration of 'struct A' [-Wattributes]
    7 | } alignas(4) ;
      |   ^~~~~~~
1.cc:7:3: note: attribute for 'struct A' must follow the 'struct' keyword

El paquete #pragma es una pequeña y extraña creación que gcc sólo soporta por compatibilidad.

 
Vict:

¿Qué muestra este ejemplo? ¿Que no has descubierto cómo usar las alineas?

Estoy de acuerdo, lo he estropeado.

Aquí está el código correcto.

#include <iostream>
struct alignas(4) A
{
  short j;
}  ;

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 8
   return 0;
}

por lo que las alineaciones no son análogas a los envases.

porque en el mismo gcc (por lo que sin smallsoft) el múltiplo de empaquetamiento por defecto es 8

porque:

#include <iostream>
struct A
{
  short j;
};

struct B
{
  short j;
  long long k;
};

int main()
{
   A q[2];
   B r[2];
   std::cout << sizeof(q) << " " << sizeof(r) << std::endl; // 4 32
   return 0;
}

pero con alignas(8)

#include <iostream>
struct alignas(8) A
{
  short j;
};

struct alignas(8) B
{
  short j;
  long long k;
};

int main()
{
   A q[2];
   B r[2];
   std::cout << sizeof(q) << " " << sizeof(r) << std::endl; // 16 32
   return 0;
}
 
Y tenga en cuenta que este es el comportamiento por defecto, no por compatibilidad con los softwares
 
TheXpert:
Y ten en cuenta que este es el comportamiento por defecto, no por compatibilidad con smallmicrosoft

No entiendo la idea. Todo está bien en el ejemplo, no veo ningún problema. Por defecto - alineación de la estructura == toma la alineación de requisitos más estricta entre los miembros.

struct {char;} == 1, struct {char;short} == 2, struct {char;int} == 4, etc. Es así en todas partes. Y largo == ocho, por lo que alineas no tiene efecto.

 
Vict:

No entiendo la idea. Todo está bien en el ejemplo, no veo el problema.

Sí, tienes razón, el ejemplo no es un indicador.

La conclusión es que mql pack funciona como #pragma pack y no como alignas.

 
Gente, compartid algo de información. ¿Para qué utiliza la alineación?