Jump to content
Sign in to follow this  
seuqram

[Resolvido] Tamanho de uma estrutura com um int e um char

Recommended Posts

seuqram

#include <iostream>

using namespace std;

struct Char
{
  char c;
};

struct Int
{
  int i;
};

struct Int_Char
{
  int i;
  char c;
};

int main()
{
  cout << sizeof(Char) << endl;
  cout << sizeof(Int) << endl;
  cout << sizeof(Int_Char) << endl; //?
  while(1){}
}

//Output:
//1
//4
//8

Não estou a perceber porque é que a estrutura "Int_Char" têm 8 bytes, o esperado não seria 5?

Edited by seuqram

Share this post


Link to post
Share on other sites
seuqram

Já sei a resposta para o meu problema. Para alguém que não saiba e esteja interessado:

É um processo de otimização em que em vez de se ter os dados assim:

Screenshot_1.jpg?noCache=1464371751

Espalham-se os dados assim:

Screenshot_2.jpg?noCache=1464371787

O que é melhor para o performance.

Screenshot_3.jpg?noCache=1464371817

Como eu tenho na pergunta inicial, um char sozinho é igual a 1byte (8bits).

Mas quando eu junto um inteiro, em vez de se misturarem os dados dentro do mesmo bloco de 4bytes e de um quarto da parte do bloco seguinte,

devidem-se em dois blocos diferentes. É por isso que a minha estrutura "Int_Char" têm 8Bytes.

Isto aumenta o tamanho mas também aumenta a rapidez que o processador procura os elementos.

Edited by seuqram
  • Vote 1

Share this post


Link to post
Share on other sites
HappyHippyHippo

é pena que o C não tenha 2 bytes, tornaria o exmeplo mais completo.

no entanto, é bom saber que conseguiste descobrir sozinho a razão do padding.

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Flinger

Já agora um aparte, só para complementar a tua informação.

Esse padding (ou alinhamento) é dependente do processador e do compilador. Isto significa que não podes contar que a tua estrutura vá ter o mesmo tamanho em todas as plataformas e em todos os compiladores.

Isto faz com que o envio de estruturas binárias através de streams (sockets p ex.) seja traiçoeiro quando do outro lado pode estar uma máquina com um processador com uma arquitectura diferente.

Edited by Flinger
  • Vote 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.