具有灵活数组成员的结构的“数组”

杰哥

我正在重写一些具有结构数组的旧代码,每个结构都有一个长度在编译时固定的数组成员。外部数组中的结构数在编译时确定以适合(典型)内存页面。我想在运行时使内部数组变量,但保持“外部数组适合页面”逻辑完整(并用于sysconf(_SC_PAGESIZE)精确获取页面大小)。所以我的结构有一个灵活的数组成员

struct foo_t 
{
  bar_t *bar;
  float baz[];
};

我想要一系列这些东西,但当然这是不允许的。但是所有这些结构都具有相同大小的灵活数组成员(运行时确定),所以我可以使用它们的“数组”吗?也就是说,有char *足够的空间来容纳其中的n个,自己进行偏移量计算,并将指针偏移量转换为foo_t *然后访问、修改等。

我的目标是 C99、C11。

埃里克·波斯皮希尔

C 标准不支持这一点。在实践中,您可以计算运行时结构大小和元素位置:

#include <stddef.h>


typedef struct Unknown bar_t;


struct foo_t
{
    bar_t *bar;
    float baz[];
};


/*  Calculate the size required for an array of struct foo_t objects in which
    each flexible array member has NElements elements.
*/
size_t SizeOfFoo(size_t NElements)
{
    /*  Create an unused pointer to provide type information, notably the size
        of the member type of the flexible array.
    */
    struct foo_t *p;

    /*  Calculate the size of a struct foo_t plus NElements elements of baz,
        without padding after the array.
    */
    size_t s = offsetof(struct foo_t, baz) + NElements * sizeof p->baz[0];

    //  Calculate the size with padding.
    s = ((s-1) / _Alignof(struct foo_t) + 1) * _Alignof(struct foo_t);

    return s;
}


/*  Calculate the address of the element with index Index in an “array” built
    of struct foo_t objects in which each flexible array member has NElements
    elements.
*/
struct foo_t *SubscriptFoo(void *Base, size_t NElements, ptrdiff_t Index)
{
    return (struct foo_t *) ((char *) Base + Index * SizeOfFoo(NElements));
}

这可能存在一些语言律师问题,但我不希望它们影响实际的编译器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有灵活数组成员的结构的大小

如何均匀地分配具有灵活数组成员的结构体数组?

具有灵活数组成员的结构的数组如何表现?

是否允许返回具有灵活数组成员的结构?

比较指向具有灵活数组成员的结构的 2 个指针

C ++“替换”为具有灵活数组成员的结构

具有灵活数组成员的结构和具有指针成员的结构之间的区别

从具有灵活数组成员的结构强制转换为没有该变量的其他结构是否是未定义的行为?

如何初始化具有 unint_t 作为灵活数组成员的结构?

与具有柔性数组成员的匿名结构联合

具有数组成员的结构

返回具有数组成员的本地结构

具有弹性char数组成员的结构

什么是结构中的灵活数组成员?

未命名结构的灵活数组成员

嵌套结构中的灵活数组成员

GCC与Clang复制结构灵活数组成员

没有命名成员的GCC错误结构灵活数组成员

当我对结构进行浅拷贝时,灵活数组成员没有被复制

为什么使用灵活的数组成员进行的结构初始化无效但对于固定大小的数组成员却有效?

使用数组并在结构中分配内存(灵活的数组成员)

sizeof()具有零长度数组成员的结构

可变长度数组和灵活数组成员之间有什么区别?

具有静态数组成员变量的迭代器

类具有带动态数组成员的类

联合会支持灵活的数组成员吗?

使用灵活的数组成员实现堆栈

灵活的数组成员,以访问联合原始字节

C ++中的灵活数组成员的可移植仿真?