在编译时初始化灵活的数组成员

铁杆亨利

我正在尝试优化嵌入式应用程序的启动时间和运行时间,为此,我想在编译时初始化一些恒定的灵活数组成员。我发现一些帖子说您必须使用 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成员放置在内存中的正确位置的任何技巧。

请注意,我的目标是:

  • 通过避免不必要的 malloc 来减少启动时间
  • 通过将 bar通常与相应的 foos 放在相同的缓存页面中来减少内存抖动
  • 通过没有指向条的指针来减少内存需求

如果有人知道这样做的任何好技巧,我很想听听他们

格哈德

您尝试使用相关变量的某些顺序很容易出错,因为编译器不需要在您想要的位置分配变量。

使用静态变量而不是动态分配内存的唯一方法是将灵活数组的成员直接添加到变量的初始化程序中:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

灵活数组成员的静态初始化

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

为什么灵活数组成员的静态初始化有效?

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

初始化固定的C数组成员结构

弹性数组成员的非静态初始化?

数组成员的初始化程序无效

删除类的复制构造函数时,初始化类的数组成员

初始化列表中的零初始化数组成员

在编译时使用constexpr初始化指向成员函数的指针数组

如何通过引用初始化函数内部的结构数组成员

初始化struct数组成员的最有效方法?

数组成员可以自引用初始化吗?

将初始化列表传递给C ++中的数组成员

C ++中的struct char数组成员初始化

为什么在构造函数初始化程序中初始化 const char 数组成员不兼容?

为什么需要在constexpr类中成员初始化非静态数组成员?

当将值分配给结构初始化程序中的字符串数组成员时,为什么会收到“ int-conversion”警告?

在编译时初始化double

通过基类构造函数从驱动类模板值初始化基类数组成员变量

在类模板中使用条件运算符初始化静态constexpr char数组成员

使用std :: index_sequence初始化具有固定大小数组成员的POD结构容器

继承:构造函数,在C ++ 11中初始化C之类的基类的数组成员

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

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

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

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

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

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