É a linguagem C. Está escrito que:
typedef struct __attribute__((packed, aligned(4))) Ball {
float2 delta;
float2 position;
//float3 color;
float size;
//int arcID;
//float arcStr;
} Ball_t;
Ball_t *balls;
Diga-me qual é o significado e como usar essa palavra-chave.
aligned(4)
você provavelmente não tenha muito com que se preocupar.Respostas:
Antes de responder, gostaria de fornecer alguns dados do Wiki
O alinhamento da estrutura de dados é a maneira como os dados são organizados e acessados na memória do computador. Consiste em duas questões separadas, mas relacionadas: alinhamento de dados e preenchimento da estrutura de dados .
Quando um computador moderno lê ou grava em um endereço de memória, ele faz isso em blocos do tamanho de palavras (por exemplo, blocos de 4 bytes em um sistema de 32 bits). Alinhamento de dados significa colocar os dados em um deslocamento de memória igual a alguns múltiplos do tamanho da palavra, o que aumenta o desempenho do sistema devido à maneira como a CPU lida com a memória.
Para alinhar os dados, pode ser necessário inserir alguns bytes sem sentido entre o final da última estrutura de dados e o início da próxima, que é o preenchimento da estrutura de dados .
O gcc fornece funcionalidade para desativar o preenchimento da estrutura. ou seja, para evitar esses bytes sem sentido em alguns casos. Considere a seguinte estrutura:
sizeof(sSampleStruct)
será 12 em vez de 8. Por causa do preenchimento da estrutura. Por padrão, no X86, as estruturas serão preenchidas com alinhamento de 4 bytes:Podemos
__attribute__((packed, aligned(X)))
insistir no preenchimento de tamanho (X) específico. X deve ter poderes de dois. Consulte aquiportanto, o atributo gcc especificado acima não permite o preenchimento da estrutura. então o tamanho será 8 bytes.
Se você deseja fazer o mesmo para todas as estruturas, basta pressionar o valor do alinhamento para empilhar usando
#pragma
fonte
packed
significa que ele usará o menor espaço possível parastruct Ball
- isto é, amontoará os campos juntos sem preenchimentoaligned
significa que cadastruct Ball
um começará em um limite de 4 bytes - ou seja, para qualquerstruct Ball
, seu endereço pode ser dividido por 4Essas são extensões do GCC, que não fazem parte de nenhum padrão C.
fonte
O atributo
packed
significa que o compilador não adicionará preenchimento entre os camposstruct
. O preenchimento é geralmente usado para tornar os campos alinhados ao tamanho natural, porque algumas arquiteturas impõem penalidades pelo acesso não alinhado ou não o permitem.aligned(4)
significa que a estrutura deve estar alinhada a um endereço divisível por 4.fonte