WEB开发网
开发学院软件开发VC 消息值,托管字符串,扰乱代码及其它 阅读

消息值,托管字符串,扰乱代码及其它

 2006-07-20 11:39:33 来源:WEB开发网   
核心提示: Figure 3 Disassembler 中的 StrLit如果你花点时间看看 MSIL,你将发现 modopts 无处不在,消息值,托管字符串,扰乱代码及其它(4),一个 modopt 的完全描述已超出了本栏目范围,但是其基本思路是编译器 能用 modopt 提供有关公共语言运行时无法

Figure 3 Disassembler 中的 StrLit

如果你花点时间看看 MSIL,你将发现 modopts 无处不在。一个 modopt 的完全描述已超出了本栏目范围,但是其基本思路是编译器 能用 modopt 提供有关公共语言运行时无法理解的类型的附加信息,但是该程序集的其它使用者可能理解——在这种情况下,该信息就是全局常量。CLR本身没有常量的概念,但是 程序集的其它使用者可能知道。如果该程序集被引入 C++,则 C++ 编译器会知道该变量是个常量;但是如果该程序集被 C# 使用,C# 编译器将会忽略 modopt 常量,因为 C# 没有常量的概念,正如你所能看到的,当你在托管代码中使用原生类型时有许多奇怪或迷惑发生。

当你用 S 语法使用托管文字量时,不管怎样,一切都很简单:

// String* s1 = new String(S"This is a String literal");
ldstr "This is a String literal"

这里没有函数调用,仅有一个 ldstr 指令。这个指令将引用某个字符串文字量的新对象压入,储存在程序的元数据中。无论是用文字量创建 String 对象还是直接将它传递给需要字符串的 某些函数,都是如此:

// Console::WriteLine(S"World");
ldstr "World"
call void [mscorlib]System.Console::WriteLine(string)

了解所发生的事情的另外一种方法是用/FAs编译程序来生成一个程序集列表。(是的,它也可以用于 MSIL)Figure 5 展示了用/FAs编译 StrLit 后经过编辑的结果,。这里有趣的是你可以看到编译器为 TCHAR字符串 "This is a TCHAR string" 生成了两个字符串($SG1883 and $SG2266),即使它们有相同的内容。然而,此处针对 S"This is a String literal" 仅有一个托管字符串 文字量 ($StringLiteralTok$70000001$),它被使用了两次。大多数程序员调用 "uniquification” 进程,但是 出于某种原因微软的家伙们(Redmondtonians)称之为“字符串暂留”(string interning)”。正如说明文档所描述的:“公共语言基础架构(CLI)确保涉及具有相同字符序列的两个元数据符号的两个 ldstr 指令的结果精确地返回相同字符串对象。”

上一页  1 2 3 4 5 6 7 8  下一页

Tags:消息 托管 字符串

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接