假设n
是一个整数(C中的int
变量)。我需要足够的空间“4倍于n的上限除以3”字节。我如何保证足够的空间?
您认为malloc(4*(int)ceil(n/3.0))
会做什么,或者我是否必须添加1
才能绝对安全(由于可能的舍入错误)?
答案 0 :(得分:5)
你可以用纯整数运算实现同样的事情,这可以保证你分配正确的内存量: 修改固定括号
malloc(4*((n+2)/3))
答案 1 :(得分:2)
要整合计算n / m
的上限,只需说:
n / m + (n % m == 0 ? 0 : 1)
总而言之,请malloc(4 * (n / 3 + (n % 3 ? 1 : 0)));
。
答案 2 :(得分:2)
KerrekSB的通用公式的替代方案,即保证只使用一个除法,是计算
(N + M-1)/ M
要查看它产生相同的内容,请使用n = k*m + r
写下0 <= r < m
。然后是n%m == r
,如果是r == 0
,我们有n+m-1 = k*m + (m-1)
和(n+m-1)/m == k
,否则为n+m-1 = (k+1)*m + (r-1)
和(n+m-1)/m == k+1
。
当你进行整数除法时,大多数现代硬件在一个寄存器中为你提供商(n/m
)而在另一个寄存器中为余数(n%m)
,因此你可以在一个分区中获得Kerrek公式的两个部分,大多数编译器都会这样做。如果编译器没有,但使用两个分区,计算将会相当慢,所以如果经常进行计算并且性能是个问题,那么你可以使用稍微不那么明显的代码解决编译器的弱点。
在给定的情况下,malloc
将是
malloc(4*((n+2)/3));
但是,由于每个人对这个公式的作用并不明显,如果你使用它,在评论中解释它,如果你不需要使用它,那就使用更明显的代码。
答案 3 :(得分:1)
虽然Kerrek SB有一个确切的答案,但实际上大多数工程师会使用malloc (4 + 4 * n / 3)
或(等效)malloc (4 * (1 + n / 3))
。 C
将n/3
评估为整数的规则导致截断余数。在表达式中添加更多内容可确保分配忽略的任何分数。
最多可能浪费三个字节。只有当存在数千个这样的时候才会有任何额外的计算来解释这个是合理的 - 也许。 malloc
的实现通常将存储分配舍入为4,8或16字节的倍数,以简化其内务管理。
考虑3字节内存的成本:Current pricing每GB为5到15美元。三个字节的成本为0.000 000 009。