[C++]聊聊size_t
在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,原本只需要一条指令解决的问题,现在硬生生需要两条指令。
看下图:
思考三个问题:
1.是否由于size_t的使用,解决了兼容性的问题?(有效解决)
2.不同的类型声明方式,哪种更有效率?(size_t)
3.代码可读性是否会因为size_t地使用而增强?(definitely!)