闲聊c/c++: size_t、ptrdiff_t、socklen_t数据类型

本篇目的:

  • 了解size_t/ptrdiff_t这两个机器相关数据类型
  • 了解socklen_t数据类型
  • 这三个数据类型是为了跨平台而重新typedef的

在闲聊c/c++之: 各平台下基本数据类型的字节长度一文中,我们总结了一张基本数据类型在各个平台中字节长度表:

闲聊c/c++: size_t、ptrdiff_t、socklen_t数据类型_第1张图片
各平台各编译器下基本类型字节长度表.png

根据上表,我们可以看到指针的字节长度:

  • 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));
vc32_size_ptrdiff_socklen.png

vc64_size_ptrdiff_socklen.png

android_ndk_size_ptrdiff_socklen.png

nano_size_ptrdiff.png

esp32_size_ptrdiff.png

ios_size_ptrdiff_socklen.png

raspberrypi_size_ptrdiff_socklen.jpg

闲聊c/c++: size_t、ptrdiff_t、socklen_t数据类型_第2张图片
ubuntu_64_size_ptrdiff_socklen.jpg

为了编译器数据的完整性,更是为了android开发环境,服务器环境以及交叉编译树莓派,花了点时间安装了ubuntu 64 操作系统,整个安装过程我都视频录制下来了。等我剪辑好后放上来。正在逐渐从windows开发转向linux开发,一起学习


  • 的确如此,size_t/ptrdiff_t数据类型是和机器相关的。其sizeof字节长度和指针字节长度是一致的。

  • size_t/ptrdiff_t之间的区别如下(以windows定义为例,其他系统一样):

闲聊c/c++: size_t、ptrdiff_t、socklen_t数据类型_第3张图片
win_size_ptrdiff_define.png

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,提出两个问题:

  1. 在vc32/64中,为什么是24个字节?
  2. 在ios/android/linux中,上述代码的ptrdiff_t是36,为什么和vc32/64的ptrdiff不一致?

2. socklen_t:

  • windows下定义在头文件:#include
  • ios/linux定义在头文件: #include
  • 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

你可能感兴趣的:(闲聊c/c++: size_t、ptrdiff_t、socklen_t数据类型)