Bagikan melalui


__declspec(code_seg)

Khusus Microsoft

Atribut code_seg deklarasi menamai segmen teks yang dapat dieksekusi dalam .obj file tempat kode objek untuk fungsi atau fungsi anggota kelas disimpan.

Sintaks

__declspec(code_seg("segname")) declarator

Keterangan

Atribut __declspec(code_seg(...)) memungkinkan penempatan kode ke dalam segmen bernama terpisah yang dapat di-paged atau dikunci dalam memori satu per satu. Anda dapat menggunakan atribut ini untuk mengontrol penempatan templat yang dibuat dan kode yang dihasilkan kompilator.

Segmen adalah blok data bernama dalam file yang dimuat .obj ke dalam memori sebagai unit. Segmen teks adalah segmen yang berisi kode yang dapat dieksekusi. Bagian istilah sering digunakan secara bergantian dengan segmen.

Kode objek yang dihasilkan ketika declarator didefinisikan dimasukkan ke dalam segmen teks yang ditentukan oleh segname, yang merupakan literal string sempit. Nama segname tidak harus ditentukan dalam pragma bagian sebelum dapat digunakan dalam deklarasi. Secara default, ketika tidak ada code_seg yang ditentukan, kode objek dimasukkan ke dalam segmen bernama .text. Atribut code_seg mengambil alih arahan #pragma code_seg yang ada. Atribut code_seg yang diterapkan ke fungsi anggota mengambil alih atribut apa pun code_seg yang diterapkan ke kelas penutup.

Jika entitas memiliki code_seg atribut, semua deklarasi dan definisi entitas yang sama harus memiliki atribut yang identik code_seg . Jika kelas dasar memiliki code_seg atribut, kelas turunan harus memiliki atribut yang sama.

code_seg Saat atribut diterapkan ke fungsi cakupan namespace atau fungsi anggota, kode objek untuk fungsi tersebut dimasukkan ke dalam segmen teks yang ditentukan. Saat atribut ini diterapkan ke kelas, semua fungsi anggota kelas dan kelas berlapis—termasuk fungsi anggota khusus yang dihasilkan kompilator—dimasukkan ke dalam segmen yang ditentukan. Kelas yang ditentukan secara lokal—misalnya, kelas yang ditentukan dalam isi fungsi anggota—jangan mewarisi code_seg atribut cakupan penutup.

code_seg Saat atribut diterapkan ke templat kelas atau templat fungsi, semua spesialisasi implisit templat dimasukkan ke dalam segmen yang ditentukan. Spesialisasi eksplisit atau parsial tidak mewarisi code_seg atribut dari templat utama. Anda dapat menentukan atribut yang sama atau berbeda code_seg pada spesialisasi. Atribut code_seg tidak dapat diterapkan ke instans templat eksplisit.

Secara default, kode yang dihasilkan kompilator seperti fungsi anggota khusus dimasukkan ke .text dalam segmen . Direktif #pragma code_seg tidak mengambil alih default ini. code_seg Gunakan atribut pada templat kelas, templat kelas, atau fungsi untuk mengontrol tempat kode yang dihasilkan kompilator diletakkan.

Lambda mewarisi code_seg atribut dari cakupan penutupnya. Untuk menentukan segmen untuk lambda, terapkan code_seg atribut setelah klausul deklarasi parameter dan sebelum spesifikasi yang dapat diubah atau pengecualian, spesifikasi jenis kembali berikutnya, dan isi lambda. Untuk informasi selengkapnya, lihat Sintaks Ekspresi Lambda. Contoh ini mendefinisikan lambda dalam segmen bernama PagedMem:

auto Sqr = [](int t) __declspec(code_seg("PagedMem")) -> int { return t*t; };

Berhati-hatilah saat Anda menempatkan fungsi anggota tertentu—terutama fungsi anggota virtual—di segmen yang berbeda. Katakanlah Anda menentukan fungsi virtual di kelas turunan yang berada di segmen halaman saat metode kelas dasar berada di segmen non-halaman. Metode kelas dasar atau kode pengguna lainnya dapat mengasumsikan bahwa memanggil metode virtual tidak akan memicu kesalahan halaman.

Contoh

Contoh ini menunjukkan bagaimana code_seg atribut mengontrol penempatan segmen saat spesialisasi templat implisit dan eksplisit digunakan:

// code_seg.cpp
// Compile: cl /EHsc /W4 code_seg.cpp

// Base template places object code in Segment_1 segment
template<class T>
class __declspec(code_seg("Segment_1")) Example
{
public:
   virtual void VirtualMemberFunction(T /*arg*/) {}
};

// bool specialization places code in default .text segment
template<>
class Example<bool>
{
public:
   virtual void VirtualMemberFunction(bool /*arg*/) {}
};

// int specialization places code in Segment_2 segment
template<>
class __declspec(code_seg("Segment_2")) Example<int>
{
public:
   virtual void VirtualMemberFunction(int /*arg*/) {}
};

// Compiler warns and ignores __declspec(code_seg("Segment_3"))
// in this explicit specialization
__declspec(code_seg("Segment_3")) Example<short>; // C4071

int main()
{
   // implicit double specialization uses base template's
   // __declspec(code_seg("Segment_1")) to place object code
   Example<double> doubleExample{};
   doubleExample.VirtualMemberFunction(3.14L);

   // bool specialization places object code in default .text segment
   Example<bool> boolExample{};
   boolExample.VirtualMemberFunction(true);

   // int specialization uses __declspec(code_seg("Segment_2"))
   // to place object code
   Example<int> intExample{};
   intExample.VirtualMemberFunction(42);
}

END Khusus Microsoft

Lihat juga

__declspec
Kata kunci