❗易错点 1:unsigned long 在不同平台长度不同

long 曾经比int大,因为int很早是2字节,但是在windows上一样

平台 编译模型 unsigned long 大小
Windows 64/32位 LLP64/LP64 4字节(32位)
Linux/macOS 64位 LP64 8字节(64位)

现代C++最佳实践

使用#include<cstdint>,基于C++11标准,跨平台编程,使用下面的类型

类型 含义
int8_t 8位有符号整数
uint8_t 8位无符号整数
int16_t 16位有符号整数
uint16_t 16位无符号整数
int32_t 32位有符号整数
uint32_t 32位无符号整数
int64_t 64位有符号整数
uint64_t 64位无符号整数

size_t

size_t表示内存中可寻址的最大大小,其大小与平台的指针大小(地址总线宽度)相关。

1
#include <cstddef>  // size_t 定义在这里
平台 指针大小 size_t大小 最大值
32位 4字节 4字节 4GB (2^32 - 1)
64位 8字节 8字节 16EB (2^64 - 1)
1
2
3
4
5
6
// 错误示例
for(int i = vec.size()-1; i >= 0; --i) // 可能永远不会结束

// 正确示例
for(size_t i = vec.size(); i-- > 0;) // 使用后递减
for(auto i = vec.size(); i-- > 0;) // 更简单的方法