分配适当的内存大小

Posted

技术标签:

【中文标题】分配适当的内存大小【英文标题】:Allocating proper memory size 【发布时间】:2012-03-05 07:14:52 【问题描述】:

在我的程序中分配正确大小的内存时遇到问题。我执行以下操作:

void * ptr = sbrk(sizeof(void *)+sizeof(unsigned int));

当我这样做时,我认为它向堆中添加了太多内存,因为它以 void* 而不是字节为单位分配它。如何告诉它我希望 sizeof(whatever) 表示 whatever 字节而不是 whatever 其他单位?

编辑:

我见过其他人将事物转换为 char,以便编译器以字节为单位获取大小。如果 sizeof(unsigned int) 是 4 字节,但我使用的类型是 void *,编译器会破坏 void * 大小的 4 倍而不是 4 字节吗?

【问题讨论】:

您能解释一下为什么要在此处添加sizeof(void*) 吗?你打算用这个内存做什么?另外,你有什么理由不在这里使用plain-ol'malloc 简答:要么你知道你在做什么,你不需要问这个问题,要么你知道你在做什么,你不应使用sbrk(),而应使用malloc() 我正在避免使用 malloc,因为我正在尝试一些系统调用(例如 sbrk()),并且我正在尝试在此内存块中存储任何类型的指针和无符号整数我添加到堆中 为了清楚起见,sizeof 运算符返回字节大小。我不明白你在问什么。您是否尝试过打印结果尺寸以检查它是否符合您的预期? 我相信您知道自己在做什么,并意识到使用它代替 malloc 会降低程序的性能 【参考方案1】:

传递多个字节作为sbrk 的参数。

在Linux中,sbrk的原型是:

void *sbrk(intptr_t increment);

http://www.kernel.org/doc/man-pages/online/pages/man2/brk.2.html

sbrk() 以递增字节递增程序的数据空间。

但正如 cmets 中的一些人所补充的,如果您想动态分配内存,您正在寻找 malloc 函数而不是 sbrkbrksbrk 是系统调用,通常在内部用于实现 malloc 用户函数。

【讨论】:

所以 sbrk 只会以字节为单位接受它的参数吗?我似乎记得您分配的任何内存类型都会影响 sbrk 或 malloc 的大小 @mrswmmr Linux sbrk 函数和标准 malloc 函数将多个字节作为它们的操作数,【参考方案2】:

内核以页面粒度管理进程内存。这意味着进程地址空间必须增长(或缩小)整数页。 因此,即使sbrk 获得多个字节,它也会向进程添加至少一页。

【讨论】:

以上是关于分配适当的内存大小的主要内容,如果未能解决你的问题,请参考以下文章

zeppelin 使用 yarn-application 模式时如何设置适当的 jobmanager 内存大小

怎么查看动态分配内存空间的大小(c语言)。

具有大小动态分配和预定大小的简单数组内存分配

内存不足错误发生在堆大小高但分配大小低的情况下。为啥?

确保内存分配的大小正确[重复]

结构成员大小大于为结构分配的内存