一个简单的问题:当你必须定义一些数组在C中可以采用的(任意)最大值时,人们的做法是什么。所以,有些人只选择一个数字,希望它足够大,其他人则是质数更接近圆数(!)等,其他一些更深奥的数字,如素数更接近......等等。
我想知道,决定这些价值观的最佳做法是什么?
感谢。
答案 0 :(得分:5)
没有一般规则。 twos的功能适用于缓冲区,我经常使用1024用于C中的字符串缓冲区,但任何其他数字都可以使用。素数对于哈希表非常有用,在哈希表中,简单的模数散列适用于素数大小。当然,您将大小定义为符号常量,以便以后可以更改它。
答案 1 :(得分:5)
如果我无法确定合理的最大值,我倾向于使用malloc
和realloc
来根据需要增长数组。当你不能保证它足够大以达到预期目的时,使用固定大小的阵列是危险的。
答案 2 :(得分:3)
最佳做法是尽可能避免任意限制。
这并不总是可能的,所以第二好的做法是对阵列可能需要持有的最大的东西进行有根据的估计,然后以健康的幅度进行四舍五入,至少25%。当我这样做时,我倾向于选择10的幂,因为它在检查时明显表示该数字是任意限制。 (两个人的权力也经常表示,但只有当读者认为这个数字是2的幂时,并且大多数代码的读者都没有那个表记忆过去2 16 。有一个很好的理由使用2的幂,它需要大于它,用十六进制写。离题结束。)总是记录你估计数组需要保持的最大东西背后的推理,即使它是很简单,“任何单个源文件大于2GB的人都需要重新考虑他们的编码风格”(actual example)
除非您特别需要素数的属性(例如,作为Juho提及,对于哈希表,否则不要使用素数 - 但如果您的哈希函数不是很好,那么您只需要那个 - 但通常不幸的是。)当你这样做时,记录你有意使用素数以及为什么,因为大多数人不会在视线中识别素数或知道为什么在特定情况下他们可能是必要的。
答案 3 :(得分:0)
如果我需要这样做,我通常使用2的幂,或者更大的数据集,保存数据所需的页数。大多数情况下,我更喜欢在堆上分配一块内存,然后如果缓冲区大小不足则重新分配。
答案 4 :(得分:0)
我只有在有充分理由让某个特定数字达到最大值时才定义最大值。否则,我会动态调整大小,可能是最大程度的检查(例如,一个人的名字不应该是几兆字节)。
答案 5 :(得分:0)
使用舍入数字(2的幂),因为它们通常很容易使用malloc(许多实现与两种大小的各种功能块保持内存),连接器更容易使用(在静态或全局数组),也因为您可以使用按位运算来测试它们的限制,这些限制通常比<和>。
使用素数是因为使用素数大小的哈希表应该避免冲突。
但是,如果实际上并没有提供任何好处,很多人可能会使用两种尺寸的素数和功率。
答案 6 :(得分:0)
一开始就无法预测最大尺寸是多少。
例如,我编写了一个小的cmdline解释器,其中生成的每行输出都存储在大小 200 的char数组中。对于所有可能的输出都足够了,你不觉得吗?
直到我发出env命令,其中有一行〜 400 个字符(!)。
LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;
05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;
32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;
31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;
35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:';
故事的道德:尝试尽可能使用动态分配。