\x 是指將 x 映射成 ASCII 或其他指定碼表中索引為 x 的字元。
'\0' 一般被編譯成 .asm 中的常數定字,成為組語指令的「一部份」。
"\0" 則佔有 2 個字元碼寬,位於 Stack 常數保護區中,
其 asm code 視被 assign 的對象以及編譯器類型而有所不同,
這是 Visual Studio 2008 的實作方法:(未完全最佳化)
char b,ch = '0';
0041242E mov byte ptr [ch],30h
char a[] = "\0";
00412432 mov ax,word ptr [string "\0" (428978h)]
00412438 mov word ptr [a],ax
char *p = "\0";
0041243C mov dword ptr [p],offset string "\0" (428978h)
char *c;
c = a;
00412443 lea eax,[a]
00412446 mov dword ptr [c],eax
c = p;
00412449 mov eax,dword ptr [p]
0041244C mov dword ptr [c],eax
b = ch;
0041244F mov al,byte ptr [ch]
00412452 mov byte ptr ,al
'\0' 成為定字 0x30,可直接編成機器碼:C6 45 EF 30
此處,array 的配置較 pointer 繁瑣,多了 3 Byte:
array 機器碼 :66 A1 78 89 42 00 66 89 45 E0
pointer 機器碼:C7 45 D4 78 89 42 00
但使用上能以較快的微指令來實作 (lea 一般占 1-cycle,
可勝出大部分 mov 家族) ,故速度較快。
[
本帖最後由 daviddr 於 2008-7-15 01:25 AM 編輯 ]