Postgres用户定义类型并正确分配内存

时间:2019-01-13 20:41:13

标签: c postgresql memory-management

我正在为postgres编写扩展,其中包括创建新的可变长度基本类型,但是我在理解SET_VARSIZE的语义方面有些困难。

以下面的示例代码为例,它不能完全反映我的用例,但可以说明这一点。

typedef struct another_struct 
{
  char *a;
  char *b;
} another_struct;

typedef struct test_struct
{
  char vl_len_[4];
  another_struct *data;
} test_struct;

1)在为test_struct的新实例分配内存时,大概我可以简单地执行以下操作,并且它将考虑可变长度成员vl_len_?的大小。

test_struct *t = palloc0(sizeof(struct test_struct));

2)因为another_struct的两个成员的长度都是可变的,所以我想我还需要跟踪为这两个字段分配了多少内存,以便将正确的长度传递给SET_VARSIZE?

3)调用SET_VARSIZE时是否还需要考虑another_struct指针的大小?

我在想对SET_VARSIZE的最终调用看起来像这样

SET_VARSIZE(t, sizeof(struct test_struct) + sizeof(struct another_struct) + a_and_b_length);

这接近正确吗?道歉,对于任何错误,我对于使用C编程还是很陌生。

谢谢

1 个答案:

答案 0 :(得分:0)

仅使用常规指针无法做到这一点。在size成员之后,所有内存必须在一起。

typedef struct another_struct 
{
  char a[FLEXIBLE_ARRAY_MEMBER];
  char b[FLEXIBLE_ARRAY_MEMBER];
} another_struct;

typedef struct test_struct
{
  char vl_len_[4];
  another_struct data;
} test_struct;

,您现在必须知道数据的实际大小。

test_struct *t = palloc0(VARHDRSZ + size_of_a + size_of_b);
SET_VARSIZE(t, VARHDRSZ + size_of_a + size_of_b );
memcpy(t->data.a, src_a, size_of_a);
memcpy(t->data.b, src_b, size_of_b);

文档中的示例只有一个字段,因此我仅假设这种方式有效。 间接可能还有其他问题。 来源:https://www.postgresql.org/docs/current/xfunc-c.html