C/C++バイト揃え
1271 ワード
1背景
バイトアライメントが必要な根本的な原因は、CPUがデータにアクセスする効率の問題の配列であり、標準データ型の場合、そのアドレスはその長さの整数倍であればよく、標準データ型ではなく以下の原則でアライメントされる.
配列:基本データ型で位置合わせされ、最初に位置合わせされた後の自然も位置合わせされます.
≪結合|Combine|oem_src≫:最大長のデータ型で配置されます.
≪構造体|Structure|oem_src≫:構造体の各データ型を整列させます.
本論文では,構造体の整列方式を重点的に解析した.
2構造体におけるバイト整列のケーススタディ
2.1構造体一
3 g++で直接位置合わせを設定する方法:_attribute__((packed))
以上のように、__が追加されましたattribute__((packed))後,Aが占有する空間は8バイトではなく6バイトである.
[1]C言語バイト整列
[2]5分でメモリバイトの位置合わせが完了
バイトアライメントが必要な根本的な原因は、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分でメモリバイトの位置合わせが完了