消息值,托管字符串,扰乱代码及其它
2006-07-20 11:39:33 来源:WEB开发网核心提示: 我正用托管 C++ 写一个应用程序并且碰到一个关于字符串 文字量的问题,我知道我能用_T("sample string") 或 S"Sample String" 创建一个字符串,消息值,托管字符串,扰乱代码及其它(3),我也知道 S 字符串文字量更有
我正用托管 C++ 写一个应用程序并且碰到一个关于字符串 文字量的问题。我知道我能用_T("sample string") 或 S"Sample String" 创建一个字符串。我也知道 S 字符串文字量更有效率,但好象很少有人知道它为什么有效以及效率高在哪。两种类型的字符串 有何差别?托管字符串文字量确切含义是什么,以及为什么它更好?
Randy Goodwin
理解托管字符串文字量和普通C/C++ 字符串文字量之间差别的最好方法是用它们写相同的代码并考察其编译结果。我写了一个简单的托管 C++ 程序,StrLit.cpp,这个程序用C++和.NET风格创建了一些 String 文字量,代码如 Figure 2 所示。Figure 3 和 Figure 4 展示了用 ILDASM 反汇编的 Microsoft 中间语言(MSIL)代码。正如你可能知道的许多事情一样,其首要差别就是当你使用 C++ 文字量时,编译器产生一个对相应 String 构造函数的调用:// String* c2 = new String(_T("This is a TCHAR string"));
ldsflda valuetype $ArrayType$0x11197cc2
modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier)
''?A0x1f1e2151.unnamed-global-0''
newobj instance void [mscorlib]System.String::.ctor(int8*)
我会马上解释这段冗长而令人费解的文字,但其基本思路是编译器加载了 C++ 字符串文字量的地址,然后产生一个 newobj 指令,该指令将文字量地址到 String 的构造函数。另外,编译器为非托管字符串文字量创建了一个专门的 Array 类型——这就是前面代码段中样子奇怪的 $ArrayType$0x11197cc2,还有一个 被命名为?A0x1f1e2151.unnamed-global-0 的静态实例,如图 Figure 3 所示:
更多精彩
赞助商链接