![](/img/trans.png)
[英]How does `int sum = n + - + - + - + n` compile where `n` is an `int`?
[英]Guaranteeing enough storage space for 4*ceil(n/3), where n is an int
假設n
是一個整數(C中的一個int
變量)。 我需要足夠的空間來存儲“ n的上限的4倍除以3”字節。 如何保證有足夠的空間?
您認為malloc(4*(int)ceil(n/3.0))
會做,還是我必須添加例如1
以便絕對安全(由於可能的舍入錯誤)?
您可以通過保證您分配正確的內存量的純整數算法來實現相同的目的: 編輯固定括號
malloc(4*((n+2)/3))
要整體計算n / m
的上限,只需說:
n / m + (n % m == 0 ? 0 : 1)
總共說malloc(4 * (n / 3 + (n % 3 ? 1 : 0)));
。
保證只使用一個除法的KerrekSB通用公式的替代方法是計算
(n + m-1)/米
要看到它產生相同的結果,請將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));
但是,由於每個人都不清楚該公式的作用,因此,如果使用它,請在注釋中進行解釋,如果不需要使用它,請使用更明顯的代碼。
盡管Kerrek SB給出了一個精確的答案,但實際上大多數工程師會使用malloc (4 + 4 * n / 3)
或(等效) malloc (4 * (1 + n / 3))
。 C
的規則將n/3
評估為整數,導致舍去余數。 向表達式中添加更多內容可確保分配該除法忽略的任何分數。
最多可能浪費三個字節。 只有其中有數千種,才有可能進行任何額外的計算以說明這一點。 malloc
實現通常會將存儲分配舍入為4、8或16個字節的倍數,以簡化其內部管理。
考慮一下3字節內存的成本: 當前定價為每GB 5到15美元。 三個字節的費用為$ 0.000 000009。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.