Untuk membuat halaman kotor (mengaktifkan bit kotor di entri tabel halaman), saya menyentuh byte pertama halaman seperti ini:
pageptr[0] = pageptr[0];
Namun dalam praktiknya, gcc akan mengabaikan pernyataan tersebut dengan eliminasi penyimpanan mati. Untuk mencegah gcc mengoptimalkannya, saya menulis ulang pernyataan sebagai berikut:
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
Tampaknya triknya berhasil, tetapi agak jelek. Saya ingin tahu apakah ada arahan atau sintaksis yang memiliki efek yang sama? Dan saya tidak ingin menggunakan -O0
bendera, karena itu akan membawa penalti untuk performa yang bagus juga.
-O0
tidak mencegah kode mati "optimasi", misalnya, ketika GCC mendeteksi beberapa kode tidak berpengaruh, itu hanya menghapusnya. AFAIK ini adalah tahap bahkan sebelumnya-O0
... Tapi itu hanya pengalaman sayaJawaban:
Mematikan pengoptimalan akan memperbaiki masalah, tetapi itu tidak perlu. Alternatif yang lebih aman adalah membuatnya ilegal bagi kompilator untuk mengoptimalkan penyimpanan dengan menggunakan
volatile
tipe qualifier.The
volatile
jenis kualifikasi menginstruksikan compiler untuk menjadi ketat tentang toko memori dan beban. Salah satu tujuannyavolatile
adalah untuk memberi tahu kompilator bahwa akses memori memiliki efek samping, dan karena itu harus dipertahankan. Dalam kasus ini, penyimpanan memiliki efek samping menyebabkan kesalahan halaman, dan Anda ingin kompilator mempertahankan kesalahan halaman.Dengan cara ini, kode di sekitarnya masih dapat dioptimalkan, dan kode Anda portabel ke kompiler lain yang tidak memahami GCC
#pragma
atau__attribute__
sintaksis.sumber
volatile
artinya akses memori harus terjadi seperti yang tertulis, persis seperti yang kita inginkan. Dengan kata lain, kita telah memikirkannya dengan hati-hati, dan itu berarti apa yang kita pikirkan.Kamu bisa memakai
untuk menonaktifkan pengoptimalan sejak GCC 4.4.
Lihat dokumentasi GCC jika Anda membutuhkan detail lebih lanjut.
sumber
Alih-alih menggunakan pragma baru, Anda juga bisa menggunakan
__attribute__((optimize("O0")))
untuk kebutuhan Anda. Ini memiliki keuntungan karena hanya diterapkan ke satu fungsi dan tidak semua fungsi ditentukan dalam file yang sama.Contoh penggunaan:
sumber
-Olevel
opsi tetapi saya menggunakan opsi individu yang diaktifkan secara terpisah? (Dalam kasus saya, saya tidak dapat menentukan opsi pengoptimalan individual mana yang melanggar kode) .