如果在 C 中允許負索引,這里已經很好地詢問了,但我很好奇經常使用這種技術有任何性能下降。例如,它是否破壞了編譯器在某個硬體平臺上使用 base offset 索引的能力,或者混淆了優化器等。
我問是因為我有很多帶有簽名的解碼例程
decode_something(char *buffer, int buffer_size, int bit_position) {
...
if (((bit_position need_bits) >> 3) < buffer_size) {
x= buffer[bit_position >> 3] ...
bit_position = need_bits;
...
}
我意識到如果我使用指向緩沖區末尾的指標,我可以大大簡化所有代碼:
decode_something(char *buf_limit, int bits_remaining) {
...
if (need_bits <= bits_remaining) {
x= buf_limit[ -((bits_remaining 7) >> 3) ];
bits_remaining -= need_bits;
...
}
(好吧,實際上這個例子并沒有展示它是如何變得“更”簡單的,但是你可以推斷出呼叫這個函式或保存決議狀態只需要兩個變數而不是三個變數的所有情況。)
現在我正在考慮在整個庫中使用這種模式,但我想知道是否有理由不這樣做。
uj5u.com熱心網友回復:
例如,它是否破壞了編譯器在某個硬體平臺上使用 base offset 索引的能力,或者混淆了優化器等。
號 C 語言標準明確定義它:
從 C11 標準#6.5.6p8 開始:
8 當一個整數型別的運算式被添加到指標或從指標中減去時,結果具有指標運算元的型別。如果指標運算元指向陣列物件的元素,并且陣列足夠大,則結果指向與原始元素偏移的元素,使得結果和原始陣列元素的下標之差等于整數運算式。換句話說,如果運算式 P 指向陣列物件的第 i 個元素,則運算式 (P) N(等效于 N (P))和 (P)-N(其中 N 的值為 n)指向分別指向陣列物件的第 i n 個和第 in 個元素,前提是它們存在。……
以防萬一,如果您不知道:
從 C11 Standard#6.5.2.1p2 開始,下標運算子的定義:
下標運算子[]的定義是E1[E2]等同于(*((E1) (E2)))。
你的另一個問題:
但我很好奇經常使用這種技術有任何性能下降。
它歸結為問題-有兩個號碼a和b,這兩個操作的-a b并且a - b,其操作比其他快。
決定加法、減法等運算時間的不是語言,而是底層處理器。如果您真的對此感興趣,則必須深入研究底層處理器的指令集并比較各個指令的延遲等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/418557.html
標籤:
