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 做减法时需小心溢出(可能转为极大正数)。