2

是否可以在不使用堆的情况下在 C 中创建类似 Vector 的通用数据结构。基本上我需要一个数组数据类型,但如果它有一个更通用的版本。

typedef struct {
 /* some data types*/
}TYPE1;

typedef struct {
 /* some data types*/
}TYPE2;

typedef struct _GCACHE_T
{
        const int element_size;
        const int count;
        struct _ELEMENT {
                        UBYTE           data[element_size];
                        BOOLEAN         is_valid;
                }element[count];
}GCACHE_T;

GCACHE_T f_cache1 = {sizeof(TYPE1), 15, {0} };
GCACHE_T f_cache2 = {sizeof(TYPE2), 10, {0} };

上面的代码不会编译,但我提供它是为了更清楚地说明我的要求。

如果允许使用堆内存,这将很容易实现。由于该代码用于小型 micros 堆内存使用是不允许的。

我本可以立即使用,但只是检查它是否可以以通用方式完成。

TYPE1 f_cache1[15];
TYPE2 f_cache2[10];

Vector 不会变大。我也可以使用联合,但有一个内存权衡,所以不愿意使用它。

4

1 回答 1

0

C 不支持此类参数(模板、通用)类型。您可以采用类似于 BSD 套接字子系统使用的方法。不同的网络地址(例如 IP 地址和 TCP/UDP 端口号)存储在不同大小的结构中(取决于地址族,例如 IPv4 结构比 IPv6 结构短),但在开始时具有相似的布局。每当需要地址时,都会传递一个指向泛型struct sockaddr类型的指针,并从套接字的地址族中推断出正确的结构类型。

C 支持所谓的灵活数组成员,但它不能简单地应用于您的情况,因为不仅struct _ELEMENT条目的数量不同,而且这些元素的大小可能会根据 的值而有所不同element_size。这使得在不参考实际类型的情况下很难以cache.element[i].data[j]可移植的方式计算地址。您可以做的是在GCACHE_T类型的开头添加一个附加字段,以帮助您识别 的真实大小struct _ELEMENT

typedef struct _GCACHE_T
{
    int element_size;
    int count;
    size_t element_stride;
    struct _ELEMENT {
        BOOLEAN         is_valid;
        UBYTE           data[];
    } element[];
} GCACHE_T;

element_stride保持具体元素类型的大小(包括任何填充)。请注意,因为 C 只允许结构的最后一个元素是灵活的元素,所以将其is_valid移到前面。data[]

然后,您将创建特定类型,例如

typedef struct _GCACHE_TYPE1_15_T
{
    int element_size;
    int count;
    size_t element_stride;
    struct {
        BOOLEAN         is_valid;
        UBYTE           data[sizeof(TYPE1)];
    } element[15];
} GCACHE_TYPE1_15_T;

GCACHE_TYPE1_15_T f_cache1 = {
    sizeof(TYPE1),
    15,
    // An awful hack to obtain the size of a structure member
    sizeof(((GCACHE_TYPE1_15_T *)0)->element[0])
};

do_something((GCACHE_T *)&f_cache1);

如果您需要声明许多不同的缓存类型,宏会派上用场。现在do_something()您可以计算地址,f_cache1.element[i].data[j]因为您知道data内部字段的偏移量,struct _ELEMENT并且您可以计算偏移量,element[i]因为单个元素的大小存储在element_stride字段中。

是的,我知道,这真的很痛苦……而且我不确定在像 PIC 这样的哈佛架构设备上需要多少指针算法。

于 2012-09-12T17:11:22.780 回答