我正在尝试优化嵌入式应用程序的启动时间和运行时间,为此,我想在编译时初始化一些恒定的灵活数组成员。我发现一些帖子说您必须使用 malloc,但理论上,应该可以在没有...的情况下执行此操作
例如,假设我有:
typedef struct _foo_t {
foo_t *next;
int num_bars;
bar_t bars[];
} foo_t __attribute((__packed__));
而且我确实有几百万个 foo_t 实例。然后我有一个脚本来生成一个包含所有信息的头文件。所以我可能有这样的事情:
const foo_t foo1 = {.next = &foo2, .num_bars = 2};
const bar_t foo1_bar1 = {...};
const bar_t foo1_bar2 = {...};
foo_t *const first_foo = &foo1;
但是,这样做的问题是编译器规范不保证&foo1_bar1
不保证在&foo1.bars[0]
. 我想知道是否有任何人知道强制将 foo X _bar Y成员放置在内存中的正确位置的任何技巧。
请注意,我的目标是:
如果有人知道这样做的任何好技巧,我很想听听他们
您尝试使用相关变量的某些顺序很容易出错,因为编译器不需要在您想要的位置分配变量。
使用静态变量而不是动态分配内存的唯一方法是将灵活数组的成员直接添加到变量的初始化程序中:
const foo_t foo1 =
{
.next = &foo2,
.num_bars = 2,
.bars =
{ [0] = {...},
[1] = {...}
}
};
专用初始化器是可选的。
至少对于 GCC,这应该有效。
不幸的是,不可能使用通用(sizeof(arr)/sizeof(arr[0]))
技巧来获取数组中的元素数量:
foo_t foo1 =
{
.next = &foo2,
.bars =
{ [0] = 1,
[1] = 2
},
.num_bars = sizeof(foo1.bars)/sizeof(foo1.bars[0]),
};
test.c:21:21: error: invalid application of ‘sizeof’ to incomplete type ‘bar_t[]’ {aka ‘int[]’}
21 | .num_bars = sizeof(foo1.bars)/sizeof(foo1.bars[0]),
| ^
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句