聊聊size_t
2016.10.05 • C++ • 阅读量:次
在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!)
继续阅读
-
GDB调试
利用bt和f命令调试core文件
· C++
-
map和set的坑
做题过程中遇到很多需要map和set处理的场景,这篇博客讨论map,unordered_map,set,unordered_set,unordered_multiset的区别和联系,以及背后的数据结构实现等。
· C++
-
从C++的字符串分割展开讨论
C++没有内置字符串的分割函数,惊不惊喜,意不意外?
· C++