C语言中字符串循环的计数器与指针实现性能对比
计数器遍历 vs 指针遍历:哪种C语言字符串遍历性能更优?
先给结论:在现代编译器的优化下,这两种写法的性能完全没差别,甚至会被编译成一模一样的机器码。
具体原因:
- 编译器会自动抹平差异:主流编译器(GCC、Clang、MSVC这些)的优化能力很强,计数器版本里的
str[i]本质是*(str + i),编译器一眼就能看出这是连续的内存访问,会直接把它转换成指针递增的逻辑,和你手写的指针版本完全一致。 - 底层指令完全相同:以x86架构为例,两种写法最终生成的机器指令都是:从字符串的基地址开始,每次读一个字节,然后地址寄存器自增,直到碰到终止符
\0。计数器版本里的i递增和地址计算步骤,会被编译器直接优化掉,不会多做任何无用功。 - 老旧编译器的极端情况(几乎不用考虑):如果是几十年前那种没有优化能力的古董编译器,指针版本可能会略快一点——因为它不需要每次计算
str + i的地址,直接指针自增就行。但这种场景现在基本碰不到了。
你提供的两段代码:
计数器实现
const char str[] = "Hello World!"; for (unsigned short i = 0; str[i]; i++) { char c = str[i]; }
指针实现
const char str[] = "Hello World!"; for (const char* i = str; *i; i++) { char c = *i; }
内容的提问来源于stack exchange,提问作者M 027
相关产品推荐
相关产品推荐

