我知道当您执行 char array[] = "string" 时,字符串文字“string”会从数据段复制到堆栈。字符串文字是否逐字符复制?或者编译器获取字符串文字的起始和结束地址并将整个字符串一次性复制到堆栈中?
thanks
只要观察到的结果相同,编译器就会做它“想做”的任何事情。有时根本没有副本。
C 标准没有指定如何完成复制,因此 C 实现可以自由地通过任何方式实现结果。 C 标准强加的唯一要求是可观察的结果(例如写入标准输出的文本)必须符合定义。
当工程师设计高质量的 C 实现时,他们会花一些时间考虑在这种情况下复制字符串的最佳方法,并且他们会寻求设计一个在每种情况下选择最佳方法的编译器。可以使用“移动立即值”指令来构建短字符串。长字符串可以通过调用来复制memcpy
。中间字符串可以通过内联调用来复制memcpy
,实际上是一些指令,每条指令移动几个字节。
当工程师设计一个廉价的 C 实现时,只需完成工作即可将代码移植到机器上,但不需要很快,他们会做对他们来说最简单的事情。
有时编译器根本不会复制字符串:如果编译器可以告诉您不需要副本,则没有理由制作副本。例如,如果编译器发现您只是将字符串传递给printf
并且根本不修改它,那么编译器会得到相同的结果,而无需通过将原始传递给进行复制printf
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)