gpt4 book ai didi

c - C 中的胖指针

转载 作者:太空狗 更新时间:2023-10-29 16:05:30 25 4
gpt4 key购买 nike

我读过 Cello fat pointer library并想知道在 C 中是否真的允许在某些数据前添加一个 header ,例如像这样:

struct header
{
size_t length;
};

char* create_string(const char* cstr)
{
void* ret = malloc(sizeof(struct header)+strlen(cstr)+1);
((struct header*)ret)->length = strlen(cstr);
strcpy((char*)ret + sizeof(struct header), cstr);
return (char*)ret + sizeof(struct header);
}

size_t get_length(const char* sized_string)
{
struct header* tmp = sized_string - sizeof(struct header);
return tmp->length;
}

此示例是一个字符串,但它可以是存储的任何其他内容,甚至可能不是数组,在这种情况下, header 可以具有不同类型的元数据。

我知道 sds 使用灵活的数组成员,但这需要 c99 并且不如这种方法灵活(除非您只是使用通用的 char 数组并根据需要重新转换它)。

特别是in this question人们说以下内容实际上不可移植:

struct header {
size_t len;
unsigned char data[1];
};

因为访问第一个元素以外的数据是UB。另一件事是行 ((struct header*)ret)->length = strlen(cstr);struct header* tmp = sized_string - sizeof(struct header); 在我看来是错误的(因为指针转换),而且我没有找到更好的方式来编写它们。

最佳答案

您的示例仅从固定偏移量放置和读取。所以至少指针算法是完全合法的。至少只要类型只是一个 char

问题在于对齐。这还没有违反语言标准,但实际数据的对齐方式比例如更差。 x86 上的编译器将默认提供。

因此,如果编译器默认对齐到 8 字节(x86 上的 gcc 和 msvc)或 16 字节(x64 上),您的示例代码只提供一半对齐。

这可能是非法的,如果编译器假定对齐内存(否则将通过匹配 malloc 实现以及堆栈布局和结构中的填充来确保)。根据架构,它甚至可能导致错误,因为指令可能需要最低限度的对齐。

关于c - C 中的胖指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50376392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com