📅  最后修改于: 2023-12-03 15:09:27.019000             🧑  作者: Mango
sizeof
是一种在 C 和 C++ 中使用的操作符,它提供了一个简单的方法来确定一个类型或变量的大小。 sizeof
返回以字节为单位的大小。
int x = 5;
size_t size = sizeof(x);
printf("%zu\n", size); // 输出 4 (32 位机器)
然而,有时候我们需要知道我们定义的结构体或类型的大小。这就需要我们自己来实现一个类似于 sizeof
的函数来完成这项任务。
以下是一个简单的方法来确定结构体或类型的大小:
#define my_sizeof(type) ((char *)(&type + 1) - (char *)&type)
这样定义之后,你就可以使用 my_sizeof
函数来取得结构体或类型的大小。它使用指向类型的指针,计算类型的结束地址,减去类型的起始地址,并将结果转换为 char *
类型。
struct my_struct {
int x;
int y;
};
int main() {
size_t size = my_sizeof(struct my_struct);
printf("%zu\n", size); // 输出 8 (32 位机器)
return 0;
}
上面的实现方法可以很好地处理结构体和基本类型,但是对于包含指针或函数指针的结构体类型,它可能会失效。为了解决这个问题,我们需要更复杂的实现。
我们可以使用一个宏来创建一个通用的类型大小计算函数:
#define DECLARE_SIZEOF(type) \
size_t sizeof_##type() { \
static type t; \
return (char *)(t + 1) - (char *)&t; \
}
这个宏会为指定的类型生成一个函数 sizeof_类型名()
。 这个函数声明了一个静态类型变量,将其初始化为每种类型的默认值,并计算该类型在内存中占用的空间。
struct my_struct2 {
int x;
char *str;
void (*func_ptr)();
};
DECLARE_SIZEOF(struct my_struct2)
int main() {
size_t size = sizeof_struct_my_struct2();
printf("%zu\n", size); // 输出 16 (32 位机器)
return 0;
}
现在,我们可以正确地计算包含指针或函数指针的结构体类型的大小。
总之,计算结构体或类型的大小可能是一项基本任务,但它是编写有效程序的基础。通过了解如何自己编写一个类似于 sizeof
的函数,你可以更好地理解变量如何存储在内存中,并且可以编写更高效的代码。