【问题标题】:Is specifying more size than required when declaring an array a bad practice? [closed]声明数组时指定的大小是否比要求的大? [关闭]
【发布时间】:2020-11-15 00:06:00
【问题描述】:

在 C 语言中,当我们不知道要保存在数组中的数据的大小时。通常,我们指定的尺寸大于要求的尺寸。这不是说我们在滥用内存吗?因为,数组是按顺序存储在内存中的,所以处理器不会一直保存这些块以备将来使用,即使它们当前没有被使用?

【问题讨论】:

  • 如果你不过分,没关系...假设你的程序需要从用户那里得到一个名字:char name[100]; 没问题char name[1000000]; 是过度了。如果您非常非常内存受限,请以时间为代价使用动态内存(与处理用户输入无关)。
  • 这取决于内存量和数组的定义方式。在 C++ 中,std::vector 分步分配内存,因此这是运行良好的类似数组的过度分配的示例。顺便说一句:阅读 mallocrealloc
  • 这个问题非常广泛。能否添加一些具体的代码示例。

标签: arrays c memory


【解决方案1】:

当您在大多数元素未被使用的地方指定非常大的尺寸(如1000000000000 等)时,这是一种不好的做法。

将数组大小指定为比所需元素的数量大一些没有问题。

虽然,可变数组长度在 C99 中是允许的。在某些情况下,您可能会要求用户自己定义数组大小。

【讨论】:

    【解决方案2】:

    视情况而定。如果您为特定程序拥有的内存资源不够大,以至于您担心分配的空间超出您的需要,那么您应该使用动态内存分配。 要应用此机制,您需要了解基础知识:callocmallocrealloc 来自 https://www.cplusplus.com/ 或其他您喜欢的文档

    【讨论】:

      【解决方案3】:

      在 C 语言中,当我们不知道要保存在数组中的数据的大小时。通常,我们会指定比要求更大的尺寸。

      首先,如果我们在编译时不知道大小,我们通常不需要也不指定比要求更大的大小。这可能是你的印象,但事实并非如此。

      在这种情况下有两种方法。

      使用可变长度数组 (VLA) 或动态内存分配

      任何 C 实现都不支持 VLA。它们最初是在 C99 中发明的,对于符合 C99 的实现是强制性的,但在符合后来的 C 标准的实现中,不需要支持 VLA。因此,使用 VLA 会使您的代码不可移植(如果可以使用的话)。

      当使用 VLA 时,处理错误的能力也更差。您无法检查 VLA 的分配是否成功。

      如果可移植性和/或错误处理很重要,您最好使用动态内存分配。

      此外,如果您喜欢动态内存,您可以调整大小并释放不再需要的内存,而 VLA 无法做到这一点。


      在声明数组时指定比要求更大的大小是不好的做法吗?

      谈到在编译时固定大小的静态分配数组,指定比要求更大的大小通常不是不好的做法。当然,您可能会浪费一些内存,但当您需要更多内存或尝试意外访问超出范围的内存(调用undefined behavior)时,保持安全总比遇到真正严重的麻烦更好。

      但是,如果浪费大小的数量很大并且可能大小之间的范围很大,那么您应该真正使用动态内存分配。例如,您不知道是否需要预先设置 10 个或 100000 个元素,并且为了安全起见分配了 100000 个元素。那将是一种不好的做法。

      在这种情况下使用动态内存也更好,因为堆栈没有堆内存那么大。

      简短的总结:如果您真的不想浪费任何内存并且想要安全,请使用动态内存分配而不是其他任何东西。

      【讨论】:

      • instead if portability is an important point. 不,可移植性不是(那么大的)问题。错误处理是一个问题 - 不要使用可变长度数组。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多