C/C++バイト揃え

1271 ワード

1背景
バイトアライメントが必要な根本的な原因は、CPUがデータにアクセスする効率の問題の配列であり、標準データ型の場合、そのアドレスはその長さの整数倍であればよく、標準データ型ではなく以下の原則でアライメントされる.
配列:基本データ型で位置合わせされ、最初に位置合わせされた後の自然も位置合わせされます. 
≪結合|Combine|oem_src≫:最大長のデータ型で配置されます. 
≪構造体|Structure|oem_src≫:構造体の各データ型を整列させます.
本論文では,構造体の整列方式を重点的に解析した.
2構造体におけるバイト整列のケーススタディ
2.1構造体一
struct A { 
    char a;  // 1    
    int b;   // 4    
    short c; // 2    
} a;         //             4    ,         4    
バイトの位置合わせ:
sizeof(A) = 12; // struct A 4    ,          
&a.a = 0;
&a.b = 4;       //   4    
&a.c = 8;
2.2構造体二
struct A { 
    char a;    // 1    
    short b;   // 2    
    int c;     // 4    
};
バイトの位置合わせ:
sizeof(A) = 8;
&a.a = 0;
&a.b = 2;   //   2    
&a.c = 4;   //   4    

3 g++で直接位置合わせを設定する方法:_attribute__((packed))
#include <stdint.h>

struct A {
    uint16_t cmd;
    uint32_t size;
} __attribute__ ((packed));

int main(void)
{
    printf("sizeof(A) = %d
", sizeof(A)); }

以上のように、__が追加されましたattribute__((packed))後,Aが占有する空間は8バイトではなく6バイトである.
[1]C言語バイト整列
[2]5分でメモリバイトの位置合わせが完了