当前位置: 首页 > 面试题库 >

重新分配是否保持posix_memalign的内存对齐?

杨曜瑞
2023-03-14
问题内容

对齐malloc是的posix_memalign,没关系,但是对齐的realloc呢?是否realloc保留对齐方式或如何确保重新分配的内存具有相同的对齐方式?假设Linux和x86_64。


问题答案:

不,ISO或POSIX不能保证realloc返回内存posix_memalign保持相同的对齐方式。A realloc 可以
简单地将当前块扩展到相同的地址,但也可以将其移动到对齐方式比原始地址严格的其他地址。

如果您想要相同的对齐方式,则最好分配另一个块并复制数据。

不幸的是,posix_memalign_realloc在单一UNIX规范中也没有任何功能。

如果您不想 每次都 经历复制数据的麻烦,可以尝试使用realloc (a),如果对齐方式与预期不符, 则只能
调用posix_memalign以获取正确对齐的地址并复制数据到那里,完成后释放旧地址。

这可能导致:

  • 零份(如果当前块可以就地扩展);
  • 一份(如果有realloc副本但碰巧会给您正确对齐的块);要么
  • 两份副本(如果是realloc副本,则由于对齐问题您还必须复制)。

根据底层内存管理的实现,它 可能 还会导致复制数量少于指示的数量。例如,“复制”可能只涉及重新映射存储块,而不是物理移动数据。

因此,您可能需要保留一些统计信息,以查看该方案是否值得。

(a)请记住,POSIX和Linux手册页都没有指定您是否甚至 可以 将这些指针传递给realloc,而只能将它们传递给free

但是,根据当前的GNU libc源代码,它似乎可以工作,尽管不能保证将来会继续工作:-)

我担心它会正常分配内存(标准对齐方式)并传回偏移地址(即,不是分配的实际地址,而是N超出的一个字节),free该地址足够聪明,可以在编织魔术之前将其转换为实际地址。

一种方法是在返回地址之前立即存储 实际 地址,尽管即使对于常规分配,这当然也会导致浪费。

在这种情况下,free可能已经变得智能化了(因为规范说它必须能够处理by所做的分配posix_memalign),但是realloc可能没有被赋予相同的智能性(因为文档对此没有任何说明)。

但是,基于GNU glibc
2.14.1,它实际上分配了比所需更多的内存,然后摆弄了舞台,以释放前空间和后空间,因此返回的地址是“真实”地址,可用于freerealloc

但是,如上所述,文档并不能保证这一点。



 类似资料:
  • 对于下面的代码:(1)“main”调用函数“f1”。(2)函数“f1”进行一些数字运算;使用malloc创建一个“char”数组,然后将数组的指针返回到main(无需取消分配-free-数组)。 我有3个与此案例相关的问题:(1)我假设,虽然函数“f1”已经终止,但分配的char数组仍然保持分配状态,直到主程序完全终止。也就是说,分配的内存仍然属于main,没有其他进程可以从外部访问(我的意思是干

  • 由分配的内存可以用重新分配。有类似的函数吗?当您不希望在堆上分配内存,并且需要多次分配可变堆栈内存(例如在库函数中,您需要动态内存,但不希望在堆上分配)时,重新分配堆栈内存可能很有用,因为库的用户可能使用自定义的堆分配策略。它看起来是这样的: 重要的是,这一切都发生在堆栈上。问:有重新分配动态堆栈内存的方法吗?

  • 在我的计算机科学课程中,我们被教导说,当你创建一个数组时,JVM会根据数组的大小自动分配内存。例如,如果您创建一个大小为10的整数数组,JVM会为该数组分配10*32位数据。 我的问题是,当您创建大小不同的对象数组时,这个过程到底是如何工作的?例如一个字符串对象。当您创建一个由10个字符串组成的数组时,系统上是否实际为这些字符串保留了任何内存,或者因为它们只是指针,所以不需要分配内存?

  • 我在任何地方都找不到如何在RDD内部执行重新分区?我知道您可以在RDD上调用重新分区方法来增加分区数量,但它是如何在内部执行的呢? 假设,最初有5个分区,他们有- 第一个分区 - 100 个元素 第二个分区 - 200 个元素 第 3 个分区 - 500 个元素 第 4 个分区 - 5000 个元素 第 5 分区 - 200 个元素 一些分区是倾斜的,因为它们是从HBase加载的,并且数据没有正确

  • 问题内容: 假设这将在一个真正的并行环境中同时在一个VM上发生: JVM如何确保堆上内存分配的线程安全性? 堆是所有线程的一个,它有自己的内部数据。 为简单起见,假设一个简单的压缩垃圾收集器实现-XX:+ UseSerialGC -XX:+ UseParallelGC,带有简单的增量指针,用于标记Eden(堆)中的可用空间的开始和一个连续的可用空间。 当为 Cat , Dog 和 Mouse 实例

  • wcsdup等函数隐式调用malloc为目标缓冲区分配内存。我想知道,由于内存分配不是很明确,所以显式释放存储似乎合乎逻辑吗?这更像是一种设计困境,赞成和反对的理由如下 应释放,因为 不释放它会导致内存泄漏。 wcsdup/_wcsdup调用malloc来分配内存,即使是从C程序调用的。 不应该被释放,因为 wcsdup积累的内存最终会在程序退出时被释放。在整个程序生命周期中,我们总是会遇到一些内