Rumah > pembangunan bahagian belakang > C++ > Adakah Peletakan Baharu pada Tatasusunan Menjamin Kemudahalihan dalam C?

Adakah Peletakan Baharu pada Tatasusunan Menjamin Kemudahalihan dalam C?

Patricia Arquette
Lepaskan: 2024-11-12 16:48:02
asal
463 orang telah melayarinya

Does Placement New on Arrays Guarantee Portability in C  ?

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);
}
Salin selepas log masuk

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:

  • Penempatan Manual Baharu: Daripada menggunakan peletakan baharu pada tatasusunan, gunakannya untuk memulakan setiap elemen tatasusunan secara individu. Contohnya:
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);
}
Salin selepas log masuk
  • Pemusnahan Manual: Musnahkan setiap elemen tatasusunan secara manual sebelum memadam penimbal untuk mengelakkan kebocoran memori.

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan