在C的标准库中有三个函数的声明如下:


/* 分配n个字节空间 */
void* malloc(size_t n);

/* 从s2中复制n个字节到s1中 */
void* memcpy(void* s1,void const* s2,size_t n);

/* 返回字符串s的长度 */
size_t strlen(char const* s);

为什么要用size_t类型声明?

从memcpy函数说起,假设标准库对memcpy的声明如下:

void* memcpy(void* s1,void const* s2,unsigned int n);

则:

处理器A(用2个字节表示unsigned int类型,4个字节表示unsigned long类型)不能复制2的16次方字节的内容,然而处理器A所能表示的最大数值是2的32次方-1

为了兼容性,假设修改memcpy的声明如下:

void* memcpy(void* s1,void const* s2,unsigned long n);

则:

处理器B(16位)需要执行两条指令来支持4个字节的unsigned long类型(标准C规定unsigned long类型至少4个字节)。对于处理器B,原本只需要一条指令解决的问题,现在硬生生需要两条指令。

看下图:


size_t


思考三个问题:

1.是否由于size_t的使用,解决了兼容性的问题?(有效解决)

2.不同的类型声明方式,哪种更有效率?(size_t)

3.代码可读性是否会因为size_t地使用而增强?(definitely!)