【问题标题】:Byte allocation different for dynamic vs. static char array of same size?相同大小的动态和静态字符数组的字节分配不同?
【发布时间】:2021-12-17 11:22:15
【问题描述】:

所以,我在我的 IDE 中运行了这段代码。谁能解释为什么当它们应该是相同大小时,为什么没有为这两个数组分配相同数量的内存?

char* dynamicCharArr = new char[15]; //allocates 8 bytes
cout << sizeof(dynamicCharArr) << endl;

char staticCharArr[15]; //allocates 15 bytes
cout << sizeof(staticCharArr) << endl;

【问题讨论】:

  • sizeof(dynamicCharArr)sizeof(char*)。因为dynamicCharArrchar*

标签: c++ memory char


【解决方案1】:

new[] 返回一个指向它分配的内存的指针。您正在打印指针本身的大小,而不是所指向的分配内存的大小。

sizeof() 无法查询已分配内存的大小。如果你传入指针本身,你会得到指针的大小。如果您传入取消引用的指针,您将获得数组 1 个元素的大小,而不是整个数组。在后一种情况下,您必须将该大小乘以传递给new[] 的元素计数。

在这两个示例中,您的代码可访问的内存量为sizeof(char) * 15。但是您根本无法仅从指针中获取该值,这就是 sizeof(dynamicCharArr) 不起作用的原因。在固定数组中,大小是数组类型的一部分,这就是 sizeof(staticCharArr) 起作用的原因。

但是,请注意,new[] 为动态数组分配的物理内存将始终略大于相同元素的固定数组使用的内存计数,因为new[] 分配了delete[] 甚至内存管理器本身使用的额外内部元数据。该元数据将包括(除了内存管理器内部需要的任何其他内容,例如调试信息、块跟踪等)new[] 分配的元素数量,因此delete[] 知道要销毁多少元素。但sizeof() 不知道(或关心)该元数据。

【讨论】:

    【解决方案2】:

    sizeof(dynamicCharArr) 让您获得指向char 数组的指针 的大小。尝试sizeof 使用不同大小的动态字符数组。它将是相同的(在同一系统上)。

    【讨论】:

      猜你喜欢
      • 2021-10-29
      • 2020-04-22
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多