sprint(buf, "%s", buf+10) where strlen(buf+10)>10 算作重叠吗?
Does sprint(buf, "%s", buf+10) where strlen(buf+10)>10 count as overlapping?
我知道如果有重叠我应该使用 memmove,但我无法想象 sprintf(或 memcpy)将如何编码以致 运行 成为问题。
来源和目标明显重叠。所以,是的,这很重要。
C 标准很明确,因此您不应该对 memcpy
的实现方式做出任何假设。想象一种架构,在这种架构中,可以比顺序更有效地乱序读取和写入内存。 memcpy
的实现者可以利用 non-overlapping 约束发出 CPU 指令,以不确定的顺序一次移动多个单词,因此可能会在读取源字节之前覆盖它们。
我知道如果有重叠我应该使用 memmove,但我无法想象 sprintf(或 memcpy)将如何编码以致 运行 成为问题。
来源和目标明显重叠。所以,是的,这很重要。
C 标准很明确,因此您不应该对 memcpy
的实现方式做出任何假设。想象一种架构,在这种架构中,可以比顺序更有效地乱序读取和写入内存。 memcpy
的实现者可以利用 non-overlapping 约束发出 CPU 指令,以不确定的顺序一次移动多个单词,因此可能会在读取源字节之前覆盖它们。