【问题标题】:malloc() non deterministic behaviour [duplicate]malloc() 非确定性行为
【发布时间】:2013-11-05 10:44:56
【问题描述】:

我知道 malloc() 至少分配了所需的大小,因此它可以提供更多。问题是它会在相同的架构中提供至少相同的内存大小吗?

例子:

int * myint = (int*)malloc(sizeof(int))
sizeof(myint)  //---> this gives me 8

每次在我的电脑上都会给我 8 个吗?

【问题讨论】:

  • 你有什么理由不相信吗?
  • 你检查的不是分配数据的大小,而是指针的大小。
  • 像很多人一样,您误解了sizeof 的作用。它确实 not 为您提供堆分配的内存块的大小。没有 C++ 函数可以做到这一点。这是使用 std::vector 而不是 malloc 的众多充分理由之一
  • 我现在才意识到您标记了 C++,但使用了 malloc,这是一个 C 构造。虽然大部分 C 语言都在 C++ 中可用,但在 C++ 中很少适用。

标签: c++ pointers memory malloc


【解决方案1】:

如果你不做malloc,它会仍然给你8。因为它根本与malloc无关!

sizeof 是一个编译时常量,它告诉您存储参数类型实例所需的大小。参数类型是int *,你的编译器显然编译为 64 位,所以指针占用 8 个字节。

注意:在 C++ 中,sizeof 始终是编译时常量。在 C 中,对于可变长度数组有一种特殊情况,其中返回数组的实际运行时大小。但是 C++ 没有变长数组,所以你不必为这种特殊情况而烦恼。

另一个注意事项:在 C++ 中,您应该使用vector 和其他集合,如果所有其他方法都失败了(不幸的是没有make_unique)new,但通常不是malloc。

【讨论】:

【解决方案2】:

没有标准的方法可以准确地知道运行时在后台保留了多少内存。甚至也没有一种标准的方法可以找出您最初要求的金额。 (如果需要记住,需要自己存储。)

给定的实现可能会保留您所要求的确切数量或更高的数量,并且可能会不时发生变化。但你不应该知道也不应该关心。

正如其他人所指出的,在您的代码中,您实际上是在询问 int* 指针的大小,而不是分配块的大小。

【讨论】:

    【解决方案3】:

    sizeof 在给定的编译中将始终返回相同的值,因为它是编译时值(在运行程序时不确定。

    但是请注意,例如我的 64 位 ubuntu 机器也可以运行 32 位代码,并且某些类型的大小会根据我是否要编译 32 位可执行文件(例如使用 gcc -m32 ...)或64 位可执行文件。所以sizeof返回的值可能取决于编译选项。

    sizeof(myint) 在您的代码中但是返回指针的大小,无法知道实际分配的内存块的实际大小(这是留给 malloc 实现的细节)。从malloc 返回的值中,您所知道的(可移植的)是它有足够的内存(即不少于您所要求的)并且可以用于存储任何基本类型(它尊重平台上最严格的对齐方式)。

    【讨论】:

    • 便携,你也知道它的对齐方式是正确的
    【解决方案4】:

    这是因为你发现的是指针的大小而不是分配内存的大小

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 2020-05-26
      • 1970-01-01
      • 2011-12-31
      • 2016-03-12
      • 1970-01-01
      相关资源
      最近更新 更多