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
Susan Sarandonasal
2024-11-19 21:09:02639semak imbas

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 };

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;
};

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";
}

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!

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