Pertanyaan Apakah inisialisasi statis dan dinamis hanya berlaku untuk variabel non-lokal?


Berikut ini kodenya:

int factorial(int n)
{
     if ( n < 0 )       return -1; //indicates input error
     else if ( n == 0 ) return 1;
     else               return n * factorial(n-1);
}

int const a = 10 ; //static initialization 
             //10 is known at compile time. Its 10!

int const b = factorial(8); //dynamic initialization 
                      //factorial(8) isn't known at compile time,
                      //rather it's computed at runtime.

(dicuri dari sini)

Jadi masuk akal bagi saya mengapa b diinisialisasi secara dinamis dan a secara statis diinisialisasi.

Tetapi bagaimana jika a dan b memiliki durasi penyimpanan otomatis (mungkin mereka telah diinisialisasi main()), bisakah Anda masih menyebut inisialisasi mereka baik statis atau dinamis? Karena, bagi saya, mereka terdengar seperti nama yang lebih umum untuk inisialisasi daripada misalnya Copy inisialisasi.

Juga, saya telah membaca ini dan adakah yang bisa mengatakan kepada saya mengapa mereka tidak secara langsung menjelaskan apa itu inisialisasi statis dan dinamis? Maksud saya, sepertinya mereka hanya menjelaskan dalam situasi apa mereka terjadi, tapi mungkin ada alasannya mengapa?

cppreference menyatakan penginisialisasi dapat meminta (beberapa intialisasi, seperti inisialisasi nilai dll), tetapi kemudian di artikel, mereka menyebutkan inisialisasi statis dan dinamis seolah-olah keduanya adalah nama yang lebih umum untuk beberapa inisialisasi. Ini bisa terdengar membingungkan, tetapi di sini saya telah menggambarkan apa yang saya pahami:

enter image description here

(bukan hal yang paling indah)


5
2017-08-10 06:40


asal


Jawaban:


Inisialisasi statis dan dinamis menggambarkan proses memuat biner dan sampai ke titik ketika utama siap dijalankan.

inisialisasi statis menggambarkan informasi kompilator dapat bekerja pada waktu kompilasi, dan memungkinkan untuk nilai tetap disimpan dalam biner sehingga pada titik ketika biner dimuat oleh sistem operasi, ia memiliki nilai yang benar.

inisialisasi dinamis menggambarkan kode yang disisipkan oleh kompiler sebelum menjalankan utama, yang menginisialisasi informasi yang tidak dapat dihitung oleh kompilator. Itu mungkin karena melibatkan kode secara langsung, atau bahwa itu mengacu pada informasi yang tidak terlihat oleh kompilator pada saat kompilasi.

Tetapi bagaimana jika a dan b memiliki durasi penyimpanan otomatis

Kasus sederhana ketika sebuah adalah variabel otomatis dari ruang lingkup terbatas.

int a = 12;

Ini tidak dapat diinisialisasi secara statis, karena compiler tidak akan tahu di mana harus menginisialisasi, karena akan berbeda setiap kali, dan pada setiap thread yang menyebutnya.

Compiler akan dapat menginisialisasi dengan sesuatu seperti.

  mov (_addr_of_a), 12

Karena _addr_of_a tidak diketahui hingga waktu proses, dan nilai 12 tertanam dalam kode, kasus untuk inisialisasi statis tidak akan dilakukan.

Kasus yang lebih rumit ...

int a[] = { /* some integer values */ };

Ini mungkin akan dilaksanakan oleh kompilator sebagai campuran kode statis dan dinamis seperti di bawah ini.

static int a_init = { /* some integer values */ };
memcpy( a, a_init, length_in_bytes_of_a );

Jadi beberapa kasus akan ada "kebocoran" dari inisialisasi statis ke dalam perilaku runtime.

Perilaku dinamis lebih bermasalah - mengasumsikan bahwa fungsi yang biasanya tidak mengekspos implementasinya, memiliki waktu eksekusi yang lambat, dan merupakan constexpr untuk memberi nilai pada cache di awal hasil. Saya belum melihat pengoptimalan ini terjadi.

Inisialisasi statis dan dinamis adalah istilah teknis yang menggambarkan proses pembuatan program yang sedang berjalan. Pola serupa mungkin ada untuk variabel lokal, tetapi mereka tidak akan jatuh ke dalam definisi teknis static dan dynamicinisialisasi.


2
2017-08-10 07:11