【发布时间】:2017-01-31 02:59:30
【问题描述】:
我最初的问题是,在一个项目中,我有几个共享生命周期的对象(即,一旦我释放其中一个,我将释放它们全部),然后我想分配一个内存块。我有三种不同对象类型的数组,struct foo、void * 和 char。一开始我想malloc()这样一个块:
// +---------------+---------+-----------+---------+---------+
// | struct foo[n] | padding | void *[m] | padding | char[o] |
// +---------------+---------+-----------+---------+---------+
但是……如果不调用未定义的行为,我怎么能做到这一点?即,尊重类型别名规则,对齐方式......如何正确计算内存块大小,声明内存块(及其有效类型),以及如何正确获取指向其中所有三个部分的指针?
(我确实知道我可以 malloc() 3 个块,这将导致三个 free(),但我想知道如何在仍然表现良好的情况下使用单个块。)
我想将我的问题扩展到一个更普遍的问题:应该采取哪些预防措施来为任意大小和对齐的对象实现memory pool,同时保持程序的良好运行? (假设可以在不调用未定义行为的情况下实现它。)
【问题讨论】:
-
为什么要关闭投票?你能解释一下我该如何改进我的问题,还是它本身就不足?
-
我在这里看到 5 个问题 - 可能会缩小范围。
-
@chux 我看到 1 个问题:如何正确地将不同类型的对象放入分配的内存中。我个人认为这是一个有趣的话题。
-
@bolov 同意主题和一个有趣的问题。 “喜欢扩展我的问题”部分超出了询问内存分配的范围。 IAC,而不是我的 DV,只提供了一个改进的想法。
-
@ray,我不是在问“我怎样才能实现 X”,我同意这太宽泛了。我的问题是关于标准中定义的规则:他们允许这样的事情吗?是否可以将不同类型的对象放在同一个内存块上?而且,如果是这样,如何正确计算偏移量?我从来没有要求过一段特定的代码。
标签: c language-lawyer undefined-behavior c11 strict-aliasing