• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2025-12-01 13:38 Aet |  隐藏边栏 |   抢沙发 |  11 
文章评分 1 次,平均分 5.0 :

cpp

数据模型和数据类型大小

  1. C++ 数据类型的大小并不是完全固定的,而是由数据模型(Data Model)决定的
    1. 不同的操作系统和编译器组合会采用不同的数据模型

为什么有不同数据模型

  1. Windows 选择 LLP64 是为了最大化 32 位代码兼容性
    1. 保持 long 为 4 字节避免破坏大量现有代码
  2. Unix 系统历史上 long 就用于"机器字长"
    1. 64 位时自然扩展到 8 字节

数据类型大小规则

  1. C++ 标准只规定了最小大小,而不是精确大小

  1. 实际实现约束

数据模型对比1

  1. Windows
    1. Windows 采用 LLP64 模型:Long Long and Pointer are 64-bit
类型 32位 Windows 64位 Windows 说明
char 1 1 固定
short 2 2 固定
int 4 4 不变
long 4 4 不变(重要!)
long long 8 8 固定
float 4 4 固定
double 8 8 固定
long double 8 8 可能更大
void* 4 8 变化
size_t 4 8 变化
  1. unix和linux
    1. Linux/Unix 采用 LP64 模型:Long and Pointer are 64-bit
类型 32位 Linux 64位 Linux 说明
char 1 1 固定
short 2 2 固定
int 4 4 不变
long 4 8 变化(关键差异!)
long long 8 8 固定
float 4 4 固定
double 8 8 固定
long double 12/16 16 可能更大
void* 4 8 变化
size_t 4 8 变化

数据模型对比2

  1. ILP32(32位系统标准模型)
    1. Int, Long, Pointer 都是 32 位
    2. 32位 Windows、32位 Linux、32位 macOS
类型 字节数
int 4
long 4
pointer 4
  1. LP64(64位 Unix 标准模型)
    1. Long, Pointer 是 64 位,Int 保持 32 位
    2. 64位 Linux、64位 macOS、大部分 Unix 系统
类型 字节数
int 4
long 8
pointer 8
  1. LLP64(64位 Windows 模型)
    1. Long Long, Pointer 是 64 位,Long 保持 32 位
    2. 64位 Windows
类型 字节数
int 4
long 4
long long 8
pointer 8

数据模型总结

  1. 32位系统(包括 Windows、Linux、macOS、Unix)用的都是 ILP32 数据模型
  2. 64位 Linux、64位 macOS、大部分64位 Unix 系统,用的都是 LP64 数据模型
  3. 64位 Windows 用的是 LLP64 数据模型

LP和LLP对比

  1. lp
    1. long 64 位 8字节
    2. long double 32位12/16字节,64位16字节
  2. llp
    1. long 64位 4字节
    2. long double 32位8字节,64位8字节

数据类型大小总结

  1. 32位ilp
    1. int,long,ptr 都是4字节
    2. long long 8字节
    3. windows:long double 8字节
      linux:long double 12字节
  2. 64位lp
    1. int,long,ptr 是4,8,8字节
    2. long long 8字节
    3. long double 16字节
  3. 64位llp
    1. int,long,ptr 是4,4,8字节
    2. long long 8字节
    3. long double 8字节

数据类型跨平台推荐

  1. 使用固定宽度类型

windows

LPARAM 和 WPARAM

  1. 概述
    1. LPARAM 和 WPARAM 是 Windows 消息机制中的两个核心参数类型,用于在发送和处理窗口消息时传递附加信息
  2. 定义

  1. 关于使用
    1. 这两个参数的具体含义完全取决于消息类型
    2. Windows 为不同的消息定义了不同的参数解释方式
  2. 用法1:简单传递数值

  1. 用法2:坐标信息

  1. 用法3:传递指针

  1. 用法4:打包多个值

相关宏

  1. 位操作

  1. 类型转换

具体消息示例

WM_KEYDOWN / WM_KEYUP

WM_HSCROLL / WM_VSCROLL

WM_NOTIFY

自定义消息

声明:本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2025-12-06
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享
繁