我应该在容器类中允许整数?

时间:2011-03-22 07:51:06

标签: c++ c arrays memory-management integer

我不希望该类因过多的值而导致崩溃。我意识到需要268,435,456个整数(如果我的数学正确)才能占用一千兆字节(这是非常极端的)。这个值只是签名的整数的最大值的八分之一(这是我目前使用的长度。我应该对此加上一个上限吗?如果是,那么这个数字是多少?会不会一个无符号的短路是一个合理的长度吗?你有没有需要一个超过65,536个值的数组?

4 个答案:

答案 0 :(得分:11)

对您的课程设置任意限制被认为是不好的做法。

您应该允许用户将任意数量的项目放入容器中;如果他们试图投入太多,那么他们应该处理将被抛出的std::bad_alloc异常。

答案 1 :(得分:1)

  

你有没有需要一个超过65,536个值的数组?

我的硬盘上有大量的文件比这更大(想到mp3,还有一些可执行文件)。

我可能希望一次在内存中存储整个文件吗?当然。

整个申请的建议

计算机只会随着时间的推移获得更多内存,所以不要使用深度硬编码的值来阻止你的应用程序。

执行此操作的一种方法是使用可变大小的容器(例如std::vector)来包含您的值。然后,您可以保留用户输入验证码以设置限制。

通常,您应该检查用户输入(包括输入文件,字段中传递的值,函数中传递的值等),并对这些值设置人为(但相当大)的上限。然后根据需要保留内部代码。这样可以更轻松地测试您的程序,因为您有一个目标“最大值”值可以拍摄。您可以测试并自信地说您支持这些上限,并且可以在用户使用高于这些限制的值时测试错误处理。

稍后,如果您真的需要/想要,可以进行性能分析/测试以调整应用程序的限制以适应目标内存占用,或者最好限制数据保持高效。

简单/低级别课程的建议

不要添加任何硬编码值。使用可变大小的容器,让更高级别的代码处理任何硬限制。

由用户正确使用您的代码,以免他们抛出异常。你的类中的代码也不应该试图捕获这种内存不足异常,因为你的代码几乎肯定无法正常恢复。

答案 2 :(得分:0)

通常预计通用容器不会对客户施加任意限制。如果你担心节省内存 - 考虑你的客户编码器(你的容器“库”代码的用户)会考虑 - 然后考虑通过使它成为模板参数给他们选择。不足之处在于,对于单个值类型,您最终可以使用多种类型的容器 - 以及模板实例化。一般来说没什么大不了的。更一般地说,客户端不太可能意外地将太多项目推入容器中,而不是意外地在一个循环中泄漏内存或者将堆分配的大小乘以某个MB_MULTIPLIER两次意外。如果他们担心,让他们写if (container.size() > 65535) throw "not likely mate";。你根本无法对付某些类型的客户滥用,并且必须让他们在开发期间做到正确。测试

答案 3 :(得分:-1)

我使用了强度为 20000000 的boolean(bool类型)数组。

至于最大尺寸,显然你不应该试图容纳比内存中更多的数据。但是,如果情况需要处理大量的数字,则需要更改程序设计。