Rumah >pembangunan bahagian belakang >C++ >Mengapa Pengkompil Tidak Menggabungkan Tulisan Atom Berlebihan dengan Nilai yang Sama?

Mengapa Pengkompil Tidak Menggabungkan Tulisan Atom Berlebihan dengan Nilai yang Sama?

Susan Sarandon
Susan Sarandonasal
2024-12-15 21:35:15367semak imbas

Why Don't Compilers Merge Redundant Atomic Writes of the Same Value?

Mengapa Penyusun Mengelakkan Penggabungan Tulisan Atom Berlebihan

Pengenalan

Penyusun sering mematuhi " as-if", membenarkan mereka menyusun semula operasi selagi tingkah laku yang boleh diperhatikan kekal konsisten. Walau bagaimanapun, dalam kes penyimpanan berturut-turut kepada pembolehubah atom dengan nilai yang sama, seperti:

std::atomic<int> y(0);
void f() {
  auto order = std::memory_order_relaxed;
  y.store(1, order);
  y.store(1, order);
  y.store(1, order);
}

penyusun cenderung untuk mengeluarkan penulisan secara berasingan.

Batasan C Standard

Manakala piawaian C 11 dan C 14 secara teknikal membenarkan ketiga-tiga kedai itu digabungkan, mereka tidak menjamin bahawa pemerhati akan melihat nilai perantaraan 2. Oleh itu, mengoptimumkan dengan melipat stor menjadi satu operasi akan melanggar niat standard untuk membenarkan sebarang pesanan yang sah.

Pertimbangan Pengkompil

Penyusun mengutamakan pengoptimuman prestasi berbanding kebolehramalan, yang membawa kepada konservatif pendekatan. Walaupun piawaian ini dibenarkan, pengkompil memilih untuk tidak menggabungkan tulisan atom untuk mengelakkan isu yang berpotensi, seperti bar kemajuan yang tersekat apabila berbilang kedai disatukan secara tidak betul.

Prinsip Kurang Kejutan

Pengaturcara biasanya menjangkakan stor atom berlaku secara berurutan, dengan setiap kedai dilaksanakan seperti yang tertulis. Jika pengkompil menggabungkan operasi ini, ia boleh memperkenalkan tingkah laku yang tidak dijangka dan melanggar prinsip paling tidak mengejutkan.

Peningkatan API Akan Datang

Perbincangan sedang dijalankan dalam kumpulan kerja C untuk melanjutkan std::atomic API dengan kawalan pengoptimuman tambahan. Ini akan membolehkan pengkompil mengoptimumkan penulisan atom dalam kes di mana ia berfaedah tanpa melanggar keperluan pesanan.

Penyelesaian Alternatif

Sementara itu, pengaturcara boleh menggunakan pembolehubah atom yang tidak menentu untuk mengelakkan pengoptimuman kedai. Walaupun kaedah ini kebanyakannya menangani isu bar kemajuan, ia bukanlah penyelesaian jangka panjang yang ideal.

Kesimpulan

Penyusun biasanya tidak menggabungkan tulisan atom berturut-turut dengan yang sama nilai untuk memastikan konsistensi dengan piawaian C, mengelakkan isu prestasi yang berpotensi dan mematuhi prinsip paling tidak mengejutkan. Walau bagaimanapun, peningkatan API pada masa hadapan mungkin membolehkan pengkompil melaksanakan pengoptimuman ini dengan selamat pada masa hadapan.

Atas ialah kandungan terperinci Mengapa Pengkompil Tidak Menggabungkan Tulisan Atom Berlebihan dengan Nilai yang Sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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