Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menentukan Saiz Tatasusunan C dengan Cekap pada Masa Penyusun?

Bagaimanakah Saya Boleh Menentukan Saiz Tatasusunan C dengan Cekap pada Masa Penyusun?

Barbara Streisand
Lepaskan: 2024-11-30 08:06:16
asal
340 orang telah melayarinya

How Can I Efficiently Determine the Size of a C   Array at Compile Time?

Memahami Fungsi Templat "Saiz Tatasusunan"

Kod ini mentakrifkan fungsi templat, GetArrLength, direka bentuk untuk menentukan saiz tatasusunan:

template<typename T, int size>
int GetArrLength(T(&amp;)[size]){return size;}
Salin selepas log masuk

Memecahkan Parameter Fungsi

Parameter T(&)[saiz] diisytiharkan sebagai rujukan kepada tatasusunan saiz saiz jenis T. Ini bermakna ia menerima rujukan kepada mana-mana tatasusunan yang jenis dan saiznya ditentukan sebagai parameter templat.

Parameter Templat Padanan

Apabila memanggil fungsi ini, pengkompil cuba menyimpulkan parameter templat. Contohnya, jika kita memanggilnya seperti berikut:

int a[10];
GetArrLength(a);
Salin selepas log masuk

Pengkompil akan menentukan bahawa T ialah int dan saiz ialah 10, mewujudkan rujukan parameter kepada tatasusunan 10 integer.

Fungsi Gelagat

Fungsi mengembalikan nilai saiz parameter templat, dengan berkesan memberikan bilangan elemen dalam tatasusunan.

Penggunaan dan Had

Kod ini memudahkan mendapatkan saiz tatasusunan tetapi mempunyai beberapa kelemahan. Pertama, ia menggunakan jenis yang ditandatangani untuk kedua-dua parameter templat dan nilai pulangan, yang bermasalah kerana saiz tidak boleh negatif. Untuk penyelesaian yang lebih mantap, jenis yang tidak ditandatangani seperti std::size_t harus digunakan.

Kedua, hasil fungsi ini bukanlah ungkapan-malar, walaupun saiz tatasusunan sepatutnya. Penilaian ungkapan malar adalah penting untuk pengoptimuman tertentu.

Penyelesaian Ekspresi Malar

Pendekatan yang lebih maju yang memberikan hasil ekspresi malar melibatkan penggunaan introspeksi jenis dan saiz operator:

template <std::size_t N>
struct type_of_size
{
    typedef char type[N];
};

template <typename T, std::size_t Size>
typename type_of_size<Size>::type&amp; sizeof_array_helper(T(&amp;)[Size]);

#define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray))
Salin selepas log masuk

Teknik ini mengeksploitasi fakta bahawa saiz tatasusunan aksara sama dengan kiraan elemennya. Operator sizeof mendapatkan semula saiz tatasusunan aksara yang digunakan untuk mewakili saiz parameter templat, memberikan penilaian ekspresi tetap bagi saiz tatasusunan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menentukan Saiz Tatasusunan C dengan Cekap pada Masa Penyusun?. 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