我們知道c語言當中結構可以使用{}進行初始化,例如有結構體定義如下:
typedef struct type_t type_t;我們可以使用下面的語句來初始化乙個變數:
struct type_t o =
但是如果像下面這樣來初始化,結果會是什麼呢?
type_t o = ;
其結果是依賴於編譯器的實現,筆者分別在vs2010和gcc下進行了測試,結果如下:
1. vs2010下c和c++的結果都是:
o.a = 8, o.b = 8, o.c = 8, o.d = 8
2. gcc的c編譯執行結果:
o.a = 8 o.b = 0, o.c = 0, o.d = 4195296
3. gcc的c++編譯執行結果:
o.a = 8, o.b = 8, o.c = 8, o.d = 8
為啥會這樣呢?帶著疑問,筆者又去看了一下反彙編的**,vs2010的反彙編**如下:
type_t o = ;這段**翻譯過來的意思就是:004113a8 mov dword ptr [ebp-18h],8
004113af mov eax,dword ptr [ebp-18h]
004113b2 mov dword ptr [ebp-14h],eax
004113b5 mov eax,dword ptr [ebp-14h]
004113b8 mov dword ptr [ebp-10h],eax
004113bb mov eax,dword ptr [ebp-10h]
004113be mov dword ptr [ebp-0ch],eax
o.a = 8;eax = o.a
o.b = eax
eax = o.b
o.c = eax
eax = o.c
o.d = eax
gcc編譯的反彙編**:
=> 0x00000000004004cd <+9>: mov -0x20(%rbp),%ecx這段**可翻譯如下:0x00000000004004d0 <+12>: mov -0x1c(%rbp),%edx
0x00000000004004d3 <+15>: mov -0x18(%rbp),%eax
0x00000000004004d6 <+18>: movl $0x8,-0x20(%rbp)
0x00000000004004dd <+25>: mov %ecx,-0x1c(%rbp)
0x00000000004004e0 <+28>: mov %edx,-0x18(%rbp)
0x00000000004004e3 <+31>: mov %eax,-0x14(%rbp)
ecx=o.aedx=o.b
eax=o.c
o.a=8
o.b=ecx
o.c=edx
o.d=eax
g++編譯的反彙編**:
=> 0x00000000004005ad <+9>: movq $0x0,-0x20(%rbp)這段**翻譯如下:0x00000000004005b5 <+17>: movq $0x0,-0x18(%rbp)
0x00000000004005bd <+25>: movl $0x8,-0x20(%rbp)
0x00000000004005c4 <+32>: mov -0x20(%rbp),%eax
0x00000000004005c7 <+35>: mov %eax,-0x1c(%rbp)
0x00000000004005ca <+38>: mov -0x1c(%rbp),%eax
0x00000000004005cd <+41>: mov %eax,-0x18(%rbp)
0x00000000004005d0 <+44>: mov -0x18(%rbp),%eax
0x00000000004005d3 <+47>: mov %eax,-0x14(%rbp)
將o變數清零o.a = 8;
eax = o.a
o.b = eax
eax = o.b
o.c = eax
eax = o.c
o.d = eax
現在該完全清楚了,g++和vs2010生成的彙編指令基本一致,都是先將前乙個成員初始化後再進行取值。而gcc則是先將o的成員變數值全部儲存的暫存器中,然後逐一對o變數進行初始化。
但是所不明白的是為何gcc要這樣生成指令?
C C 結構體初始化
c語言結構體初始化,可以如下四種 include int main int argc,const char argv 初始化的4種方式 1.定義的同時初始化 struct person p1 2.先定義再逐個初始化 struct person p2 p2.name ykd p2.age 18 p2....
關於結構體初始化的乙個問題
開始自學程式設計,但是程式設計之路困難重重,於是我打算將學習之中遇到的問題以及解決方案貼在這裡,方便以後複習。那我今天總結了一下結構體初始化的幾種方法.如下 include include typedef struct student stu intmain 定義的同時初始化 stu s2 s2 s...
C C 建構函式初始化結構體
通常我們初始化結構體使用stu.id 1 或在讀入時進行賦值scanf d stu.id 當結構體內變數很多時很不方便。我們可以使用建構函式來解決這個問題。普通定義的結構體會生成預設建構函式studentinfo 使得我們可以只定義結構體變數而不用賦值。如果想要自己提供初始化引數,下面介紹兩種做法 ...