数组作为参数
当数组作为参数传递的时候,实际上传递的是数组的首地址,在语法上来说传递的是一个指针变量。
#include<stdio.h>#include<string.h>voidgetArrLen(charbuffer[]){printf_s("using sizeof: %zd\n",sizeof(buffer));printf_s("using strlen: %zd\n",strlen(buffer));}intmain(intargc,charconst*argv[]){charbuffer[]{"Hello World"};printf_s("sizeof(buffer) : %zd\n",sizeof(buffer));getArrLen(buffer);return0;}考虑如上代码,main中的sizeof计算的是数组的长度,getArrLen中的sizeof计算的则是指针的大小,strlen计算的才是数组长度。因为在参数传递的过程中数组首地址变为了一个指针变量。
通过反汇编如上代码,我们可以发现在buffer的定义处调用sizeof实际上并没有计算buffer的长度,而是直接传递了一个立即数给printf_s,这是编译器优化的结果。因为buffer的长度在编译期间就可以确定了。
作为参数传递的时候才真正计算了buffer的长度。
strcpy和strlen
对于strcpy这个函数,编译器会使用xmm0这个寄存器来加速复制的过程。
书中说编译器会对这两个函数进行内联优化,我打开了O2编译选项,却没有看见内联优化。