Ruang nama tanpa nama adalah utilitas untuk menjadikan unit terjemahan pengidentifikasi lokal. Mereka berperilaku seolah-olah Anda akan memilih nama unik per unit terjemahan untuk namespace:
namespace unique { /* empty */ }
using namespace unique;
namespace unique { /* namespace body. stuff in here */ }
Langkah ekstra menggunakan tubuh kosong itu penting, jadi Anda sudah bisa merujuk di dalam tubuh namespace ke pengidentifikasi seperti ::name
yang didefinisikan dalam namespace itu, karena direktif penggunaan sudah terjadi.
Ini berarti Anda dapat memiliki fungsi gratis yang disebut (misalnya) help
yang dapat ada di beberapa unit terjemahan, dan mereka tidak akan berbenturan pada waktu tautan. Efeknya hampir identik dengan menggunakan static
kata kunci yang digunakan dalam C yang dapat Anda masukkan ke dalam deklarasi pengidentifikasi. Ruang nama yang tidak disebutkan namanya adalah alternatif yang unggul, bahkan dapat membuat unit terjemahan jenis lokal.
namespace { int a1; }
static int a2;
Keduanya a
adalah unit terjemahan lokal dan tidak akan berbenturan pada waktu tautan. Tetapi perbedaannya adalah bahwa a1
dalam namespace anonim mendapatkan nama yang unik.
Baca artikel yang bagus di Comeau-Computing Mengapa namespace tanpa nama digunakan sebagai ganti statik? ( Archive.org mirror ).
Johannes Schaub - litb
sumber
static
. Bisakah Anda juga membandingkan dengan__attribute__ ((visibility ("hidden")))
?Memiliki sesuatu dalam namespace anonim berarti itu lokal untuk unit terjemahan ini (file .cpp dan semua termasuk) ini berarti bahwa jika simbol lain dengan nama yang sama didefinisikan di tempat lain tidak akan ada pelanggaran Aturan Definisi Satu (ODR).
Ini sama dengan cara C memiliki variabel global statis atau fungsi statis tetapi dapat digunakan untuk definisi kelas juga (dan harus digunakan daripada
static
di C ++).Semua ruang nama anonim dalam file yang sama diperlakukan sebagai ruang nama yang sama dan semua ruang nama anonim dalam file yang berbeda berbeda. Namespace anonim sama dengan:
sumber
Namespace yang tidak disebutkan namanya membatasi akses kelas, variabel, fungsi dan objek ke file yang didefinisikan. Fungsionalitas namespace yang tidak disebutkan namanya mirip dengan
static
kata kunci dalam C / C ++.static
kata kunci membatasi akses variabel global dan fungsi ke file di mana mereka didefinisikan.Ada perbedaan antara namespace tanpa nama dan
static
kata kunci karena namespace yang tidak disebutkan namanya memiliki keunggulan dibandingkan statis.static
kata kunci dapat digunakan dengan variabel, fungsi dan objek tetapi tidak dengan kelas yang ditentukan pengguna.Sebagai contoh:
Tapi,
Tetapi hal yang sama bisa terjadi dengan namespace yang tidak disebutkan namanya. Sebagai contoh,
sumber
Selain jawaban lain untuk pertanyaan ini, menggunakan namespace anonim juga dapat meningkatkan kinerja. Karena simbol dalam namespace tidak memerlukan tautan eksternal, kompiler lebih bebas untuk melakukan optimasi kode secara agresif dalam namespace. Sebagai contoh, suatu fungsi yang disebut beberapa kali satu kali dalam satu lingkaran dapat digarisbawahi tanpa berdampak pada ukuran kode.
Sebagai contoh, pada sistem saya kode berikut ini memakan waktu sekitar 70% dari waktu berjalan jika namespace anonim digunakan (x86-64 gcc-4.6.3 dan -O2; perhatikan bahwa kode tambahan di add_val membuat kompiler tidak mau memasukkan dua kali).
sumber
-O3
dengan dirinya sendiri, maka Anda mengatakan 3 vs 4 detik adalah "waktu yang sama". tak satu pun dari ini masuk akal. saya curiga penjelasan sebenarnya akan, tetapi apa itu?Contoh tersebut menunjukkan bahwa orang-orang di proyek yang Anda ikuti tidak memahami ruang nama anonim :)
Ini tidak perlu berada dalam namespace anonim, karena
const
objek sudah memiliki hubungan statis dan karenanya tidak mungkin bertentangan dengan pengidentifikasi dari nama yang sama di unit terjemahan lain.Dan ini sebenarnya pesimis:
getState()
memiliki hubungan eksternal. Biasanya lebih baik untuk memilih tautan statis, karena itu tidak mencemari tabel simbol. Lebih baik menulissini. Saya jatuh ke dalam perangkap yang sama (ada kata-kata dalam standar yang menunjukkan bahwa file-statika entah bagaimana sudah ditinggalkan dalam mendukung ruang nama anonim), tetapi bekerja di proyek C ++ besar seperti KDE, Anda mendapatkan banyak orang yang memutar kepala Anda dengan cara yang benar berkeliling lagi :)
sumber
const
ness nanti jika diinginkan. Saya ragu itu berarti tim OP "tidak mengerti" apa pun! Juga, sedikit tentang fungsi di ruang nama anonim yang memiliki hubungan eksternal salah di C ++ 11 dan seterusnya seperti yang disebutkan. Menurut pemahaman saya, mereka memperbaiki masalah argumen templat yang sebelumnya membutuhkan tautan eksternal, sehingga dapat memungkinkan ruang nama yang tidak disebutkan namanya (dapat berisi argumen templat) memiliki tautan internal.Namespace anonim membuat variabel terlampir, fungsi, kelas, dll. Hanya tersedia di dalam file itu. Dalam contoh Anda ini adalah cara untuk menghindari variabel global. Tidak ada perbedaan kinerja waktu runtime atau kompilasi.
Tidak ada banyak keuntungan atau kerugian selain dari "apakah saya ingin variabel, fungsi, kelas, dll ini menjadi publik atau pribadi?"
sumber