C++STL---<cstddef>

news/2025/2/26 11:07:10

C++ 头文件 <cstddef> 详解

<cstddef> 是 C++ 标准库中与 内存布局和指针运算 密切相关的头文件,主要提供基础类型定义和宏操作。


核心类型定义

1. size_t

  • 用途:表示对象大小的无符号整数类型
  • 特性
    • 保证足够大以容纳系统最大可能对象的大小
    • 常见于数组索引和内存分配操作
// 遍历数组示例
int arr[5] = {1,2,3,4,5};
for(size_t i=0; i<sizeof(arr)/sizeof(int); ++i) {
    cout << arr[i] << " ";
}

2. ptrdiff_t

  • 用途:表示两个指针差值的有符号整数类型
  • 特性
    • 指针相减的结果类型
    • 用于处理指针偏移量
int arr[5] = {0};
int* p1 = &arr[0];
int* p2 = &arr[3];
ptrdiff_t diff = p2 - p1;  // 结果为3
3. nullptr_t (C++11)
  • 用途:表示空指针的类型
  • 特性
    • 仅有一个值 nullptr
    • 用于函数重载区分指针类型
void func(int) { cout << "int version\n"; }
void func(nullptr_t) { cout << "nullptr version\n"; }

func(0);     // 调用int版本
func(nullptr); // 调用nullptr版本

4. max_align_t (C++11)

内存对齐基础

计算机内存中数据存储有对齐规则,每种数据类型有特定对齐要求(起始地址须是特定值倍数),目的是提高内存访问效率。

max_align_t 用途和特性
  • 用途:用于内存对齐计算,在手动管理内存时确保分配的内存块满足所有标量类型对齐要求。
  • 特性:表示最大基础对齐要求,所有标量类型对齐要求都不超过它。
示例
#include <iostream>
#include <cstddef>
int main() {
    std::cout << "max_align_t 对齐要求: " << alignof(std::max_align_t) << " 字节" << std::endl;
    std::cout << "char 对齐要求: " << alignof(char) << " 字节" << std::endl;
    static_assert(alignof(char) <= alignof(std::max_align_t), "char 对齐要求超 max_align_t");
    return 0;
}

alignof 获取类型对齐要求,static_assert 确保标量类型对齐要求不超 max_align_t

5. byte (C++17)

用途

在编程中,有时需要直接操作原始的内存字节,比如进行底层的二进制数据处理、实现自定义的序列化和反序列化逻辑、操作硬件设备的寄存器等。在 std::byte 出现之前,通常使用 charunsigned charsigned char 来表示字节,但这些类型有其字符语义,可能会导致一些混淆。std::byte 专门用于表示字节,避免了这种语义上的混淆,使代码的意图更加清晰。

特性

1. 枚举类实现

std::byte 被定义为一个枚举类,其底层类型是 unsigned char,定义形式大致如下:

enum class byte : unsigned char {};

将其定义为枚举类的好处是,它没有隐式的类型转换,避免了意外的类型转换带来的问题。比如,不能直接将 std::byte 赋值给整数类型,除非进行显式的类型转换。

2. 位操作运算符重载

标准库为 std::byte 重载了一系列位操作运算符,方便对字节进行位级别的操作,这些运算符包括:

  • 按位与&
  • 按位或|
  • 按位异或^
  • 按位取反~
  • 左移<<
  • 右移>>

同时,还提供了对应的复合赋值运算符,如 &=|=^=<<=>>=

使用示例

#include <iostream>
#include <cstddef>

int main() {
    // 定义一个 std::byte 类型的变量
    std::byte b{0b01010101};

    // 按位取反操作
    std::byte b_not = ~b;

    // 左移操作
    std::byte b_shifted = b << 2;

    // 按位与操作
    std::byte b_and = b & std::byte{0b11001100};

    // 将 std::byte 转换为整数类型进行输出
    std::cout << "Original byte: " << static_cast<int>(b) << std::endl;
    std::cout << "Bitwise NOT: " << static_cast<int>(b_not) << std::endl;
    std::cout << "Left shifted: " << static_cast<int>(b_shifted) << std::endl;
    std::cout << "Bitwise AND: " << static_cast<int>(b_and) << std::endl;

    return 0;
}

代码解释

  1. 定义 std::byte 变量:使用初始化列表的方式定义一个 std::byte 变量 b,并初始化为二进制值 0b01010101
  2. 位操作:对 b 进行按位取反、左移和按位与操作,分别得到新的 std::byte 变量。
  3. 输出结果:由于 std::byte 不能直接输出,需要使用 static_cast<int> 将其转换为整数类型后再进行输出。

注意事项

  • 类型转换:在使用 std::byte 时,需要注意进行显式的类型转换,因为它没有隐式的类型转换。
  • 位操作的结果:位操作的结果仍然是 std::byte 类型,需要根据需要进行后续处理。

关键宏定义

1. NULL
  • 定义:空指针常量
  • C++规范
    • C++98:定义为整数0
    • C++11:推荐定义为 nullptr
int* p = NULL;  // 兼容写法
int* q = nullptr; // 现代C++推荐
2. offsetof
  • 用途:获取结构体/类成员偏移量
  • 语法offsetof(type, member)
  • 限制
    • 仅适用于标准布局类型(POD类型)
    • 不适用于有虚函数或虚基类的类型
struct Point {
    int x;
    int y;
};
size_t y_offset = offsetof(Point, y);  // 通常为4字节

版本演进

特性引入标准说明
nullptr_tC++11类型安全的空指针表示
max_align_tC++11统一内存对齐基准
byteC++17类型安全的字节操作

使用建议

  1. 优先使用 nullptr 代替 NULL 以避免类型推导问题
  2. 慎用 offsetof 确保操作对象是标准布局类型
  3. 类型一致性:内存操作时保持 size_t 和指针类型的匹配
  4. 跨平台注意:不同平台可能对 size_t 的具体实现不同(32位/64位)

典型应用场景

  1. 内存管理(malloc, new 等返回值的处理)
  2. 容器类实现(std::vector, std::string 等内部实现)
  3. 低级系统编程(直接内存操作)
  4. 跨语言接口(与C库交互时保持兼容性)

生命是这样亲历亲为的事情,每一次轻轻地擦身而过,即使只是一瞬间,都微微地改变了我们。 —宝拉·麦克莱恩


http://www.niftyadmin.cn/n/5868599.html

相关文章

【AIGC】使用Python实现科大讯飞语音服务ASR转录功能:完整指南

文章目录 讯飞ASR转写API完整指南1. 引言2. 讯飞ASR API介绍3. API参数说明3.1 认证参数3.2 上传参数3.3 查询结果参数3.4 orderResult 字段3.5 Lattice 字段3.6 json_1best 字段3.7 st 字段 4. Python代码实现4.1 生成签名4.2 上传音频文件4.3 获取转写结果4.4 解析转写结果 5…

10. docker nginx官方镜像使用方法

本文介绍docker nginx官方镜像使用方法&#xff0c;因为第一次用&#xff0c;在加上对docker也不是很熟&#xff0c;中间踩了一些坑&#xff0c;为了避免下一次用又踩坑&#xff0c;因此记录如下&#xff0c;也希望能够帮到其它小伙伴。 官方镜像页面&#xff1a;https://hub.d…

23种设计模式之《代理模式(Proxy)》在c#中的应用及理解

程序设计中的主要设计模式通常分为三大类&#xff0c;共23种&#xff1a; 1. 创建型模式&#xff08;Creational Patterns&#xff09; 单例模式&#xff08;Singleton&#xff09;&#xff1a;确保一个类只有一个实例&#xff0c;并提供全局访问点。 工厂方法模式&#xff0…

java面试题(一年工作经验)的心得

看面试题 正常人第一步肯定都会看面试题&#xff0c;我也不例外&#xff0c;在看的过程中&#xff0c;我发现有些文章写的不错&#xff0c;对我帮助不小值得推荐&#xff0c;如下&#xff1a; Java面试题全集&#xff08;上&#xff09; 很多基础的东西&#xff0c;建议先看。…

Vscode无法加载文件,因为在此系统上禁止运行脚本

1.在 vscode 终端执行 get-ExecutionPolicy 如果返回是Restricted&#xff0c;说明是禁止状态。 2.在 vscode 终端执行set-ExecutionPolicy RemoteSigned 爆红说明没有设置成功 3.在 vscode 终端执行Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 然后成功后你再在终…

【Linux探索学习】第三十一弹——线程互斥与同步(下):深入理解确保线程安全的机制

线程互斥与同步&#xff08;上&#xff09;&#xff1a;【Linux探索学习】第三十弹——线程互斥与同步&#xff08;上&#xff09;&#xff1a;深入理解线程保证安全的机制-CSDN博客 Linux探索学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?…

Ubuntu指令(一)

一、终端操作指令 打开终端&#xff0c;有两种便捷方式&#xff1a; 直接点击系统中的终端按钮&#xff1b;使用快捷键ctrl alt T。 关闭终端&#xff0c;同样有多种选择&#xff1a; 在终端输入exit指令&#xff1b;使用快捷键ctrl d&#xff1b;直接点击终端窗口的关闭…

国产编辑器EverEdit - 洞察秋毫!文件比较功能!

1 文件比较 1.1 应用场景 项目开发过程中&#xff0c;可能不同的部分会由不同的人在负责&#xff0c;存在一个文件多人编辑的情况&#xff0c;用户需要寻找差异&#xff0c;并将文档进行合并&#xff0c;比较专业的文本比较工具为BeyondCompare&#xff0c;WinMerge等。   如…