在字符串初始化期间会发生什么?
string s = "Hello World!";
它是否会调用任何这些构造函数?
public String(char* value);
public String(char[] value);
答案 0 :(得分:5)
我查看了CoreCLR存储库,看看ldstr
(参见Filip Bulovic的回答)的内容,并找到了类似这样的路径:
[vm/interpreter.cpp]
解释程序的IL评估循环点击case CEE_LDSTR
并调用Interpreter::LdStr()
LdStr()
调用ConstructStringLiteral
并传递当前方法的模块和字符串指针(当前IL指令位置+ 1)[vm/jithelpers.cpp]
ConstructStringLiteral
来电Module::ResolveStringRef
[vm/ceeload.cpp]
ResolveStringRef
来电InitializeStringData
,然后LoaderAllocator::GetStringObjRefPtrFromUnicodeString
[vm/loaderallocator.cpp]
GetStringObjRefPtrFromUnicodeString
调用LoaderAllocator特定的字符串文字地图GetStringLiteral
[vm/stringliteralmap.cpp]
GetStringLiteral
哈希字符串并尝试从本地字符串条目哈希表中获取字符串对象。如果找到,则返回哈希表中的字符串对象。如果没有,则尝试get the string object from the global string literal map。如果未在全球地图中找到该文字,则会使用GlobalStringLiteralMap::AddStringLiteral
将其添加到全球地图中。AddStringLiteral
通过调用AllocateStringObject
创建COM +字符串对象,为其分配对象句柄,并将文字作为键添加到表中,将对象作为值添加。
AllocateStringObject
:计算char计数,call is made to the garbage collector分配该大小的字符串,将字符串常量复制到COM +字符串对象,使用{{3}测试字符串对象如果为true,则在COM +字符串对象“ GetIsOnlyLowChars
中设置标志STRING_STATE_FAST_OPS
。标志将持久保存到包含字符串文字的汇编。当我们从汇编语句加载字符串时,我们会恢复标志... 的”
GetIsOnlyLowChars
与ONLY_LOW_CHARS_MASK
(即0x80000000
)和字符串中的字符进行按位AND,如果字符串仅包含小于0x80的字符,则返回true。托管(内部)方法String.IsFastSort()
...which indicates if the string can be sorted in a fast way | ref 和String.IsAscii()
src | ref < / sup>利用这个。总之,字符串文字采用非常特定的路径,不会对托管的String(char *)
或String(char[])
构造函数进行任何调用。但是,我还没有找到那些构造函数的实现,所以我只能假设他们在某个时候都调用AllocateStringObject
。
我希望这个答案符合你的“确切”的想法。
答案 1 :(得分:2)
这是C#:
public static void Main (string[] args)
{
string hello = "Hello World!";
Console.WriteLine (hello);
}
这是IL:
// method line 2
.method public static hidebysig
default void Main (string[] args) cil managed
{
// Method begins at RVA 0x20f4
.entrypoint
// Code size 13 (0xd)
.maxstack 2
.locals init (
string V_0)
IL_0000: ldstr "Hello World!"
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: call void class [mscorlib]System.Console::WriteLine(string)
IL_000c: ret
} // end of method MainClass::Main
ldstr指令将对象引用(类型O)推送到新的 表示存储在中的特定字符串文字的字符串对象 元数据。 ldstr指令分配必需的数量 内存并执行转换所需的任何格式转换 从文件中使用的表单到字符串格式的字符串文字 在运行时需要。