gpt4 book ai didi

c# - 从编译器的角度来看,字符串是怎样的?

转载 作者:IT王子 更新时间:2023-10-28 23:32:22 26 4
gpt4 key购买 nike

C中,编译器有一个指向字符串开头的指针和一个结束符号('\0')。如果用户想要计算字符串的长度,编译器必须对字符串数组的元素进行计数,直到找到'\0'

UCSD-strings中,编译器在第一个符号中有字符串的长度。

编译器如何看待C#-strings?是的,从用户的角度来看,String 是一个 object,它有一个字段 Length,我不是在谈论高级别的东西。我想知道深度算法;例如,编译器如何计算字符串的长度?

最佳答案

让我们执行以下代码:

string s = "123";
string s2 = "234";
string s3 = s + s2;
string s4 = s2 + s3;
Console.WriteLine(s + s2);

现在让我们在最后一行下一个断点并打开内存窗口:

Strings

写作 s3在内存窗口中,我们可以看到 2 个(s3s4)字符串一个接一个地分配,开头有 4 个字节的大小。

您还可以看到分配了其他内存,例如 strings类类型 token 和其他string类数据。

string class本身包含一个成员 private int m_stringLength;其中包含 string 的长度,这也使得 string.Concat()执行超快(通过在开头分配整个长度):

int totalLength = str0.Length + str1.Length + str2.Length;

String result = FastAllocateString(totalLength);
FillStringChecked(result, 0, str0);
FillStringChecked(result, str0.Length, str1);
FillStringChecked(result, str0.Length + str1.Length, str2);

我觉得有点奇怪的是 IEnumerable<char>.Count() 的执行对于 string使用默认实现完成,这意味着与 ICollection<T> 不同的是,一项一项地迭代项目喜欢 List<T> IEnumerable<char>.Count()通过取其 ICollection<T>.Count 来实现属性。

关于c# - 从编译器的角度来看,字符串是怎样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32936723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com