Erros, bugs, perguntas - página 2503

 
Alexey Viktorov:

Então o que é o insecto?

Declara um conjunto de dois elementos com dois bytes cada um e recebe 4 bytes como deve ser. Onde está o insecto? O que é isso?

É isto.

Alinha-se a 4 e 2 elementos que ocuparão 2*8 bytes.

Desculpe, mas se escrever isso, não compreende o assunto.

Análoga às cruzes:

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

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

O erro provavelmente não está aqui?

 
Vict:

Desculpe, mas se escrever isso, não compreende o assunto.

Não, parece não compreender.

//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:

Não, parece não compreender.

O pacote #pragma do material da pequenarosoft é uma coisa muito peculiar (a forma como funciona agora surpreende-me, para ser honesto). Não surpreendentemente, o padrão alignas funciona de forma diferente.

Aqui está mais:

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

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

O pacote #pragma dos pequenos softwares é uma coisa muito peculiar (a forma como funciona é surpreendente para mim agora, para ser honesto). Não admira que a alignas funcione de forma diferente na norma.

vá lá )

#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 bem também no gcc, e o que escreveu é apenas um atributo interno do gcc que funciona de forma diferente do alinhado.

 
TheXpert:

Vá lá, já).

#pragma pack funciona bem também no gcc, e o que se escreveu é apenas um atributo interno do gcc que funciona de forma diferente do alinhado.

Então, o que mostra este exemplo? Que ainda não descobriu o uso de alignas? Até o compilador pragueja o 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

O pacote #pragma é uma pequena criação estranha de softe que o gcc apenas suporta para compatibilidade.

 
Vict:

Então, o que mostra este exemplo? Que ainda não descobriu como utilizar o alignas?

Concordo, fiz asneira.

Aqui está o 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;
}

portanto o alignas não é análogo à embalagem.

porque no mesmo gcc (de modo que sem o smallsoft) o múltiplo padrão de embalagem é 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;
}

mas com 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;
}
 
E note que este é um comportamento por defeito, não para compatibilidade com software
 
TheXpert:
E note que este é um comportamento por defeito, não para compatibilidade com a pequenarosoft

Não estou a perceber a ideia. Tudo está bem no exemplo, não vejo um problema. Por defeito - alinhamento da estrutura == tomar o alinhamento de requisitos mais estrito entre os membros.

estrutura {char;} == 1, struct {char;short} == 2, struct {char;int} == 4, etc. É assim em todo o lado. E longo == oito, pelo que o alignas não tem qualquer efeito.

 
Vict:

Não estou a perceber a ideia. Tudo está bem no exemplo, não vejo o problema.

Sim, tem razão, o exemplo não é nenhum indicador.

O resultado final é que o mql pack funciona como #pragma pack e não como alignas.

 
Pessoas, partilhem alguma informação. Para que é que está a usar o alinhamento?