【问题标题】: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 会降低程序的性能

标签: c memory-management sizeof sbrk


【解决方案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 函数而不是 sbrk。 brk 和 sbrk 是系统调用,通常在内部用于实现 malloc 用户函数。

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 2017-04-07
    • 1970-01-01
    • 2023-03-03
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多