Rumah > pembangunan bahagian belakang > C++ > Bolehkah Tatasusunan Statik dalam C Dimulakan Secara Program pada Masa Penyusun?

Bolehkah Tatasusunan Statik dalam C Dimulakan Secara Program pada Masa Penyusun?

Susan Sarandon
Lepaskan: 2024-11-19 21:09:02
asal
643 orang telah melayarinya

Can Static Arrays in C   Be Programmatically Initialized at Compile Time?

Penciptaan Tatasusunan Statik Berprogram pada Masa Kompilasi dalam C

Mencipta tatasusunan statik pada masa penyusunan dalam C ialah teknik yang berharga untuk mengoptimumkan prestasi dan memastikan integriti data. Satu cara untuk mentakrif tatasusunan statik adalah melalui sintaks berikut:

const std::size_t size = 5;
unsigned int list[size] = { 1, 2, 3, 4, 5 };
Salin selepas log masuk

Walaupun pendekatan ini mudah, ia memerlukan penetapan nilai tatasusunan secara eksplisit. Untuk mendapatkan lebih fleksibiliti, mungkin wajar untuk menetapkan nilai ini "secara pemprograman" pada masa penyusunan menggunakan pelbagai teknik pengaturcaraan meta.

Soalan 1: Penetapan Nilai Programmatik

Bolehkah kita gunakan teknik pengaturcaraan meta untuk menetapkan nilai tatasusunan "secara pemprograman" pada masa penyusunan?

Jawapan:

Ya, menggunakan ciri C 0x, kita boleh memulakan tatasusunan tempatan atau ahli templat daripada senarai hujah templat variadic. Walaupun pendekatan ini mungkin dihadkan oleh kedalaman instantiasi templat, ia boleh memberikan peningkatan yang ketara dalam fleksibiliti.

Soalan 2: Penetapan Nilai Terpilih

Dengan mengandaikan bahawa semua nilai dalam tatasusunan adalah sama kecuali beberapa, bolehkah kita menetapkan nilai secara selektif pada masa penyusunan dengan cara pengaturcaraan?

Jawapan:

Ya, kita boleh menggunakan gabungan templat variadic dan templat fungsi untuk menjana tatasusunan dengan nilai tertentu. Sebagai contoh, pertimbangkan kod berikut:

template<unsigned... args> struct ArrayHolder {
    static const unsigned data[sizeof...(args)];
};

template<unsigned... args> 
const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };

template<size_t N, template<size_t> class F, unsigned... args> 
struct generate_array_impl {
    typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
};

template<template<size_t> class F, unsigned... args> 
struct generate_array_impl<0, F, args...> {
    typedef ArrayHolder<F<0>::value, args...> result;
};

template<size_t N, template<size_t> class F> 
struct generate_array {
    typedef typename generate_array_impl<N-1, F>::result result;
};
Salin selepas log masuk

Kod ini membolehkan kami membuat tatasusunan dengan nilai tertentu dengan menentukan fungsi templat yang menentukan nilai pada setiap indeks.

Contoh :

Untuk mencipta tatasusunan saiz 5 dengan nilai 1 hingga 5:

template<size_t index> struct MetaFunc { 
    enum { value = index + 1 }; 
};

void test() {
    const size_t count = 5;
    typedef generate_array<count, MetaFunc>::result A;

    for (size_t i=0; i<count; ++i) 
        std::cout << A::data[i] << "\n";
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bolehkah Tatasusunan Statik dalam C Dimulakan Secara Program 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