Bolehkah Peletakan Baharu untuk Tatasusunan Memastikan Kemudahalihan?
Walaupun peletakan baharu menyediakan cara untuk memulakan tatasusunan dalam C, penggunaannya untuk tatasusunan memperkenalkan potensi isu mudah alih. Khususnya, penuding yang diperoleh daripada [] baharu mungkin menyimpang daripada alamat yang disediakan, menghalang peruntukan penimbal untuk tatasusunan.
Piawaian 5.3.4, nota 12, mengakui percanggahan ini, menjadikannya mencabar untuk memperuntukkan penimbal bagi saiz yang sesuai untuk tatasusunan. Satu contoh menyerlahkan isu:
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); }
Dalam contoh ini, pengkompil nampaknya menyimpan kiraan elemen tatasusunan dalam empat bait pertama penimbal. Akibatnya, kerosakan memori berlaku kerana penimbal diperuntukkan dengan hanya saiz(A) * NUMELEMENTS bait ruang.
Mengelakkan Kebimbangan Mudah Alih:
Untuk mengurangkan kemudahalihan ini isu, pertimbangkan pendekatan berikut:
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); }
Adalah penting untuk ambil perhatian bahawa overhed tambahan untuk peletakan new[] boleh berbeza-beza bergantung pada pelaksanaan dan definisi kelas. Namun begitu, pendekatan manual ini memastikan mudah alih merentas penyusun yang berbeza dan menghapuskan keperluan untuk memastikan overhed secara dinamik.
Atas ialah kandungan terperinci Adakah Peletakan Baharu pada Tatasusunan Menjamin Kemudahalihan dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!