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

本篇目的:

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

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

各平台各编译器下基本类型字节长度表.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

ubuntu_64_size_ptrdiff_socklen.jpg

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


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

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

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<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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,184评论 6 13
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    保川阅读 5,990评论 1 13
  • 在线教学网站: 慕课网 极客学院 麦子学院 「慕课网」慕课网主页 慕课网是一家从事互联网在线教学的网络教育企业...
    比萨u阅读 262评论 0 2
  • 我特别欣赏一些人,有自己的观点,不干涉别人怎么说,内心强大的没有谁能控制自己的情绪,好像只要他想做的那么一定会做到...
    难又难ML阅读 425评论 0 0
  • 前两个小相框忘了拍,成品,换了背景纸和图片,这个大的相框决定放些布块,总有那么几块布印象深刻或者意义非凡。 先弄干...
    漫与手工阅读 499评论 0 0