📜  实施自己的sizeof(1)

📅  最后修改于: 2023-12-03 15:09:27.019000             🧑  作者: Mango

实施自己的sizeof

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 的函数,你可以更好地理解变量如何存储在内存中,并且可以编写更高效的代码。