構造体と共用体の[3] NDKシリーズ

この感覚のCの内容は、実際には非常に退屈ですが、仕上げの過程で実際に多くのことを学んできました

1、構造

宣言と使用

Cプログラミング構造は、JavaのJavaBeanと同様に、ユーザ定義のデータ型であります

// 一般定义变量 student a 
struct Student
{
	char name[50];
	int age;
} student,a;


//使用typedef定义
typedef struct{
    char name[50];
    int age;
} Student;

構造は、あまりにも多くのメモリを必要とし、動的なメモリ応用する場合。体内の構造および構造のフィールドに関連するバイトを占有し、ポインタ・バイトによって占有されるメモリは4/8であるため、ポインタ値が伝達効率よりも高い渡します。

Student *s = (Student*)malloc(sizeof(Student));
memset(s,0,sizeof(Student));

printf("%d\n", s->age);

バイト・アライメント

メモリ空間は、バイト単位で分割され、理論的には、変数の任意のタイプは、任意の開始アドレスからアクセスすることができます。しかし、一定の規則に従って各種のデータを必要とする特定のメモリアドレスにおける変数の特定のタイプにアクセスするときに頻繁にアクセスされる実際の開始はなく順次1整列されるストレージ、後よりも、空間内に配置されています。

バイトアライメントの問題は、構造体に主に専念しています。

struct Struct1
{
	short a;  
	int b;	
	short c; 
};
struct Struct2
{
    short a;
	short c; 
	int b;
};


// short = 2  补 2
// int = 4
// short = 2  补 2
sizeof(Struct1) = 12
    
// 2个short在一起组成一个 4 
// int = 4
sizeof(Struct2) = 8

ビットのアライメントを指定します

#pragma pack(n)nは変数ワード以上である場合、最初に占有:手段は、コンパイラバイト整列バイトアライメントがNであり、nはバイト整列開始アドレスは、2つの状況で保存されている変数のオフセットを告げますセクションの数は、デフォルトでは、デフォルトのアラインメントを満たしていない、nがオフセット変数の種類によって占有されるバイト数未満である場合には、第2、nの倍数である、アラインメントを満たさなければならないオフセット。nは、変数の型のすべてのメンバーによって占められるバイトの数よりも大きい場合、構造体の合計サイズが可変空間の倍数によって占有最大空間である必要があり、そうでない場合である:構造体の合計サイズも制約は、次の2つのサブケースを有していますnの倍数。

#pragma pack(2) //指定以2字节对齐
struct MyStruct1
{
	short a;  
	int b;	
	short c; 
};
#pragma pack()	//取消对齐
//short = 2
//int = 4      用2的倍数进行对齐
//short = 2

2、共用体

同じメモリ位置に、異なるタイプのデータを格納します

メモリは最大の組合員によって占められる一般的な材料を格納するのに十分でなければなりません

//占用4字节
union Data
{
	int i;
	short j;
}
union Data data;
data.i = 1;        1
//i的数据损坏
data.j = 1.1f;     1 

コード

https://github.com/ddssingsong/AnyNdk

おすすめ

転載: blog.csdn.net/u011077027/article/details/92991011