陣列的 Placement New 能否確保可移植性?
雖然placement new 提供了一種在 C 中初始化數組的方法,但它在數組中的使用引入了潛在的潛力可移植性問題。具體來說,從 new[] 獲得的指標可能會偏離提供的位址,從而阻礙陣列的緩衝區分配。
標準的 5.3.4,註 12,承認了這種差異,使得分配緩衝區的挑戰數組的適當大小。一個範例突出顯示了該問題:
int main() { const int NUMELEMENTS = 20; char *pBuffer = new char[NUMELEMENTS * sizeof(A)]; A *pA = new(pBuffer) A[NUMELEMENTS]; // With Visual Studio, pA will be four bytes higher than pBuffer printf("Buffer address: %x, Array address: %x\n", pBuffer, pA); }
在此範例中,編譯器似乎在緩衝區的前四個位元組中儲存了數組元素的計數。因此,會發生記憶體損壞,因為緩衝區僅分配了 sizeof(A) * NUMELMENTS 位元組的空間。
避免可移植性問題:
為了減輕這些可移植性問題,請考慮以下方法:
int main() { const int NUMELEMENTS = 20; char *pBuffer = new char[NUMELEMENTS * sizeof(A)]; A *pA = (A*)pBuffer; for (int i = 0; i < NUMELEMENTS; ++i) { pA[i] = new (pA + i) A(); } printf("Buffer address: %x, Array address: %x\n", pBuffer, pA); }
需要注意的是,放置 new[] 的額外開銷可能會因實作和類別定義而異。儘管如此,這種手動方法確保了不同編譯器之間的可移植性,並且無需動態確定開銷。
以上是數組上的放置 New 能否保證 C 中的可移植性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!