__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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk