本篇目的:
- 了解size_t/ptrdiff_t这两个机器相关数据类型
- 了解socklen_t数据类型
- 这三个数据类型是为了跨平台而重新typedef的
在闲聊c/c++之: 各平台下基本数据类型的字节长度一文中,我们总结了一张基本数据类型在各个平台中字节长度表:
根据上表,我们可以看到指针的字节长度:
- 16 bit系统中,占用2字节(arduino nano)
- 64 bit系统中,占用8字节(vc64/ios模拟器)
- 32 bit系统中,占用4字节(除了上述3个系统外)
这种与机器类型相关的数据类型,我们可以称为机器相关数据类型
问: 现在有个需求,我需要跨平台的使用统一数据类型来表示指针地址范围,我该如何办?
答: 两种方式:
typedef long long int64;
使用最大字节长度的数据类型来容纳各个平台下的地址数据使用c/c++预先定义的机器相关数据类型: size_t/ptrdiff_t
1. size_t/ptrdiff_t:
printf("size_t bytes = %d\n" ,sizeof(size_t));
printf("ptrdiff_t bytes = %d\n" ,sizeof(ptrdiff_t));
为了编译器数据的完整性,更是为了android开发环境,服务器环境以及交叉编译树莓派,花了点时间安装了ubuntu 64 操作系统,整个安装过程我都视频录制下来了。等我剪辑好后放上来。正在逐渐从windows开发转向linux开发,一起学习
的确如此,size_t/ptrdiff_t数据类型是和机器相关的。其sizeof字节长度和指针字节长度是一致的。
size_t/ptrdiff_t之间的区别如下(以windows定义为例,其他系统一样):
size_t 是无符号(unsigned)整数,而ptrdiff_t是有符号整数
size_t更适合表达指针地址值。指针地址取值范围 = size_t取值范围。
ptrdiff_t从字面意思就能知道: 两个指针地址(无正负)的差(有正负)
我们知道,指针之间具有加减操作,表示指针的移动
void printChineseStringPtrdiff()
{
char str[] = "随风而行之青衫磊落险峰行";
char *pstart = str;
char *pend = str + strlen(str);
ptrdiff_t difp = pend - pstart;
printf("%d\n", difp);
}
上述代码在vc32/64中输出24,提出两个问题:
- 在vc32/64中,为什么是24个字节?
- 在ios/android/linux中,上述代码的ptrdiff_t是36,为什么和vc32/64的ptrdiff不一致?
2. socklen_t:
- windows下定义在头文件:#include<ws2tcpip.h>中
- ios/linux定义在头文件: #include <sys/socket.h>中
- android ndk中,定义为__socklen_t而不是socklen_t
- socklen_t必须要和当前机器的int类型具有一致的字节长度,根据上面几张图,不管是32/64位系统,socklen_t都是4byte
更新我们闲聊c/c++之: 各平台下基本数据类型的字节长度中的表格:
type | vc32 | vc64 | android | arduino nano | esp32 | 树莓派 | ios | ubuntu64 |
---|---|---|---|---|---|---|---|---|
char | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
short | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
int | 4 | 4 | 4 | 2 | 4 | 4 | 4 | 4 |
long | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 8 |
long int | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 8 |
long long | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 |
float | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 |
double | 8 | 8 | 8 | 4 | 8 | 8 | 8 | 8 |
long double | 8 | 8 | 8 | 4 | 8 | 8 | 16 | 16 |
bool | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
wchar_t | 2 | 2 | 4 | 2 | 2 | 4 | 4 | 4 |
pointer | 4 | 8 | 4 | 2 | 4 | 4 | 8 | 8 |
size_t | 4 | 8 | 4 | 2 | 4 | 4 | 8 | 8 |
ptrdiff_t | 4 | 8 | 4 | 2 | 4 | 4 | 8 | 8 |
socklen_t | 4 | 4 | 4 | 无 | 没找到 | 4 | 4 | 4 |