8種機械鍵盤軸體對比
本人程式員,要買一個寫代碼的鍵盤,請問紅軸和茶軸怎麼選?
文章目錄
在C語言中,若使用struct node {}這樣來定義結構體的話。在定義變量時,需要這樣寫:struct node n;
若用typedef定義結構體,typedef struct node{}NODE; 。在定義變量時可以這樣寫,NODE n;
差別就在于使用時,是否可以省去struct這個關鍵字。
定義結構體
C 定義結構體
在C中定義一個結構體類型要用typedef:1
2
3
4typedef struct
{
int a;
}Stu;
Stu就變為了結構體類型,等同于struct Student,相當于一個别名。于是聲明變量可以使用:Stu stu1;
struct Student stu1;
另外這裡也可以不寫Student(于是也不能struct Student stu1;了)1
2
3
4typedef struct
{
int a;
}Stu;
C++ 定義結構體
但在c++裡很簡單,直接1
2
3
4struct
{
int a;
};
于是就定義了結構體類型Student,聲明變量時直接Student stu2;
在c++中如果用typedef的話,又會造成差別:1
2
3
4
5
6
7
8
9struct
{
int a;
}stu1;
typedef struct Student2
{
int a;
}stu2;//stu2是一個結構體類型
使用時可以直接通路stu1.a
但是stu2則必須先 stu2 s2;
然後 s2.a=10;
struct 與class 的差別
在C++裡struct 關鍵字與class 關鍵字一般可以通用,隻有一個很小的差別。struct 的成員預設情況下屬性是public 的,而class 成員卻是private 的。很多人覺得不好記,其實很容易。你平時用結構體時用public 修飾它的成員了嗎?既然struct 關鍵字與class 關鍵字可以通用,你也不要認為結構體内不能放函數了。
##位域
有些資訊在存儲時,并不需要占用一個完整的位元組, 而隻需占幾個或一個二進制位。為了節省存儲空間,并使處理簡便,C語言提供了一種資料結構,稱為“位域”或“位段”。所謂“位域”是把一個位元組中的二進位劃分為幾 個不同的區域,并說明每個區域的位數。每個域有一個域名,允許在程式中按域名進行操作。 這樣就可以把幾個不同的對象用一個位元組的二進制位域來表示。
一、位域的定義和位域變量的說明位域定義與結構定義相仿,其形式為:struct 位域結構名
{ 位域清單 };
其中位域清單的形式為: 類型說明符 位域名:位域長度
例如:1
2
3
4
5
6struct bs
{
int a:8;
int b:2;
int c:6;
};
下面是IOS runtime中使用位域的一個例子1
2
3
4
5
6
7
8
9
10
11
12
13
14struct {
uintptr_t indexed : 1; // 0表示普通的isa指針 1表示優化過的,存儲引用計數
uintptr_t has_assoc : 1; // 對象是否包含 associated object,如果沒有,析構時會更快
uintptr_t has_cxx_dtor : 1; // 是否有C++或ARC的析構函數,如果沒有,析構時會更快
uintptr_t shiftcls : 33; // 最重要的原來的Class cls部分,占33個bit,與 ISA_MASK 進行 & 操作可以得到 // MACH_VM_MAX_ADDRESS 0x1000000000
uintptr_t magic : 6; // 用于調試時分辨對象是否完成初始化
uintptr_t weakly_referenced : 1; // 對象是否有過weak引用,如果沒有,析構時會更快
uintptr_t deallocating : 1; // 對象是否正在析構
uintptr_t has_sidetable_rc : 1; // 表示對象的引用計數過大,無法存儲在isa指針,隻能存在side table中
uintptr_t extra_rc : 19; // 存儲引用計數,不過好像是減 1 後的值,可以在 rootRetainCount 方法中看到
// 在 64 位環境下,優化的 isa 指針并不是就一定會存儲引用計數,畢竟用 19bit (iOS 系統)儲存引用計數不一定夠。需要注意的是這 19 位儲存的是引用計數的值減一。has_sidetable_rc 的值如果為 1,那麼引用計數會存儲在一個叫 SideTable 的類的屬性中。
# define RC_HALF (1ULL<<18) // extra_rc 總共是19位,RC_HALF是18位,也就是全部引用計數的一半
};
總結
在C語言和C++語言中,struct的定義感覺非常難記憶,我記憶的方法是:首先記住C語言中的struct的定義,“typedef struct Student{}Stu;”,struct Student整體才當做是類型,至于C++的struct的定義不用記,就把struct當成是class,class怎麼使用,struct就怎麼使用。