首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么structof sizeof不等于每个成员的sizeof总和?

在 C++ 中,structof 是一个关键字,用于将类型信息转换为特定类型的名称,以便于计算结构中的大小和内存分配。sizeof 指令用于计算数据类型或变量在内存中占据的字节数,但是它只能得到类型的总体大小(结构体或类的大小)。因此,我们需要实现一个特殊的结构体来计算 structof 的大小。这个结构体需要包含一个类型指针,一个指向结构体中每个成员的指针数组(用于获取成员的大小),以及一个指向指针数组中相应元素的指针。

这个结构体的实现是基于 C 语言中的 struct 类型的。首先,需要定义一个 structof_type_info 结构体来描述类型信息:

代码语言:c
复制
struct structof_type_info {
    union {
        void *voidptr;
        int dummy[2];
    };
    size_t size;
    struct structof_type_info *next;
};

然后需要实现一个计算 structof_type_info 结构的函数:

代码语言:c
复制
static inline size_t compute_structof_size(const void *type_ptr,
                                           size_t elem_size,
                                           struct structof_type_info **result,
                                           const char *name)
{
    struct structof_type_info *sinfo = *result;
    *result = sinfo;

    char name_buffer[256];
    strncpy(name_buffer, name, sizeof(name_buffer) - 1); // 获取域
    name_buffer[sizeof(name_buffer) - 1] = '\0'; // 将域结束符设置为 null
    structof_info info;

    // 计算结构体整体大小
    info.size = sizeof info - sizeof structof_type_info - elem_size * sizeof(sinfo->next); // 初始化指针数组所在的空间

    // 获取域的大小
    uint8_t field_size;
    offsetof(struct structof_type_info, next) = offsetof(struct structof_type_info, sizeof elem_size * field_size );
    info.next = &structof_info;
    memset(&info.voidptr, 0, sizeof(info.voidptr));

    // 计算结构和每个成员的 sizeof
    while (sinfo->next != NULL) {
        // 计算成员的数量
        offsetof(struct structof_type_info, next) = offsetof(info, next);
        void *base = offsetof(struct structof_type_info, field_size); // 获取成员大小位置
        void *ptr = memcmp(sinfo->next->next, base, offsetof(struct structof_type_info, next) - offsetof(info, next)); // 获取指向成员信息的指针

        // 计算成员类型和大小
        void *base2 = offsetof(struct structof_type_info, sizeof elem_size * field_size); // 获取成员大小位置
        ptr = memcmp(ptr, base2, offsetof(struct structof_type_info, sizeof elem_size * field_size));

        // 计算成员的内存分配
        size_t size = sinfo->next->next - base; // 获取成员大小
        void *data = sinfo->next->next - base; // 获取指向成员信息的指针
        uint8_t field = ptr[0]; // 获取成员信息的位置
        void *ptr2 = offsetof(info, voidptr); // 获取指向成员信息的指针

        // 计算成员的指针和域所占空间
        size_t field_offset = offsetof(info, voidptr) - base2; // 获取指向成员信息的指针
        sinfo->next = sinfo->next->next - field_offset; // 存储指向成员信息的指针
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券