C++标准库头文件 cstddef 举例说明

C++标准库头文件 cstddef 举例说明

1. <cstddef>

<cstddef> 是 C++ 标准库头文件,定义了与 内存偏移、指针运算和大小计算 相关的类型和宏。以下是它的核心内容及代码示例:

1. 核心定义
<cstddef> 定义了以下关键内容:

  • size_t:无符号整数类型,表示对象大小(如 sizeof 返回值)。
  • ptrdiff_t:有符号整数类型,表示指针差值(如两个指针相减的结果)。
  • nullptr_t:表示空指针的类型(如 nullptr 的类型)。
  • offsetof 宏:计算结构体成员的偏移量。

2. 代码示例
(1)size_t:表示对象大小

#include <cstddef>
#include <iostream>

int main() {
    // 数组大小计算
    int arr[] = {1, 2, 3, 4, 5};
    size_t size = sizeof(arr) / sizeof(arr[0]);
    std::cout << "Array size: " << size << "\n"; // 输出 5

    // 标准容器中使用
    for (size_t i = 0; i < size; ++i) {
        std::cout << arr[i] << " ";
    }
    return 0;
}

用途:size_t 是 sizeof 和标准库(如 std::vector::size())的返回类型。

(2)ptrdiff_t:指针差值计算

#include <cstddef>
#include <iostream>

int main() {
    int arr[] = {10, 20, 30, 40, 50};
    int *p1 = &arr[0];
    int *p2 = &arr[3];

    ptrdiff_t diff = p2 - p1;
    std::cout << "Pointer difference: " << diff << "\n"; // 输出 3
    return 0;
}

用途:用于安全地表示指针之间的偏移量(可能有负数)。

(3)nullptr_t:空指针类型

#include <cstddef>
#include <iostream>

void func(int*) { std::cout << "Pointer to int\n"; }
void func(std::nullptr_t) { std::cout << "Null pointer\n"; }

int main() {
    int* ptr = nullptr;
    func(ptr);       // 调用 void func(int*)
    func(nullptr);   // 调用 void func(nullptr_t)
    return 0;
}

用途:区分空指针和其他指针类型的重载。

(4)offsetof:结构体成员偏移量

#include <cstddef>
#include <iostream>

struct Point {
    int x;
    int y;
    char label;
};

int main() {
    size_t offset_y = offsetof(Point, y);
    std::cout << "Offset of 'y': " << offset_y << "\n"; // 输出 4(假设 int 占 4 字节)
    return 0;
}

用途:在底层编程中计算结构体字段的内存位置(如序列化、内存映射)。

3. 关键点总结

类型/宏 用途 典型场景
size_t 表示对象大小或索引 sizeof、容器大小、数组遍历
ptrdiff_t 表示指针差值(可正可负) 指针算术、迭代器距离计算
nullptr_t 表示空指针的类型 函数重载时区分空指针
offsetof 计算结构体成员的字节偏移量 内存布局分析、底层数据操作

4. 注意事项

  • 跨平台兼容性:
    size_t 和 ptrdiff_t 的大小依赖平台(如 32/64 位系统)。
  • 与 C 的区别:
    C++ 中优先使用 而非 C 的 <stddef.h>。
  • 避免直接算术:
    对 size_t 做减法时需小心溢出(可能转为极大正数)。
posted @ 2025-04-28 15:16  michaelchengjl  阅读(98)  评论(0)    收藏  举报