__declspec(code_seg)
Microsoft'a Özgü
code_seg
bildirim özniteliği, işlev veya sınıf üyesi işlevleri için nesne kodunun depolandığı dosyadaki yürütülebilir metin kesimini .obj
adlandırmaktadır.
Sözdizimi
__declspec(code_seg("
segname
"))
declarator
Açıklamalar
özniteliği, __declspec(code_seg(...))
ayrı ayrı disk belleğine alınabilen veya belleğe kilitlenebilen ayrı adlandırılmış segmentlere kod yerleştirilmesini sağlar. Örneklenmiş şablonların ve derleyicinin ürettiği kodun yerleşimini denetlemek için bu özniteliği kullanabilirsiniz.
Kesim, birim olarak belleğe yüklenen bir .obj
dosyadaki adlandırılmış veri bloğudur. Metin kesimi yürütülebilir kod içeren bir kesimdir. Bölüm terimi genellikle segmentle birbirinin yerine kullanılır.
Tanımlandığında declarator
oluşturulan nesne kodu, dar dize değişmez değeri olan tarafından segname
belirtilen metin kesimine konur. segname
Adın bildirimde kullanılabilmesi için önce pragma bölümünde belirtilmesi gerekmez. Varsayılan olarak, hayır code_seg
belirtildiğinde nesne kodu adlı .text
bir kesime konur. Öznitelik code_seg
, var olan tüm #pragma code_seg yönergelerini geçersiz kılar. Üye code_seg
işlevine uygulanan öznitelik, kapsayan sınıfa uygulanan tüm code_seg
öznitelikleri geçersiz kılar.
Bir varlığın özniteliği code_seg
varsa, aynı varlığın tüm bildirimleri ve tanımları aynı code_seg
özniteliklere sahip olmalıdır. Bir temel sınıfın özniteliği code_seg
varsa, türetilmiş sınıfların aynı özniteliğine sahip olması gerekir.
code_seg
Bir ad alanı kapsamı işlevine veya üye işleve bir öznitelik uygulandığında, bu işlevin nesne kodu belirtilen metin kesimine eklenir. Bu öznitelik bir sınıfa uygulandığında, derleyici tarafından oluşturulan özel üye işlevleri dahil olmak üzere sınıfın ve iç içe sınıfların tüm üye işlevleri belirtilen kesime eklenir. Yerel olarak tanımlanmış sınıflar (örneğin, üye işlev gövdesinde tanımlanan sınıflar), kapsayan code_seg
kapsamın özniteliğini devralmaz.
code_seg
Sınıf şablonuna veya işlev şablonuna bir öznitelik uygulandığında, şablonun tüm örtük özelleştirmeleri belirtilen kesime eklenir. Açık veya kısmi özelleştirmeler, özniteliği birincil şablondan devralmaz code_seg
. Özelleştirmede aynı veya farklı code_seg
bir öznitelik belirtebilirsiniz. Açık code_seg
bir şablon örneği oluşturma işlemine öznitelik uygulanamaz.
Varsayılan olarak, özel üye işlevi gibi derleyici tarafından oluşturulan kod segmente .text
eklenir. yönergesi #pragma code_seg
bu varsayılanı geçersiz kılmaz. Derleyici tarafından code_seg
oluşturulan kodun nereye yerleştirileceği denetlemek için sınıfı, sınıf şablonu veya işlev şablonundaki özniteliğini kullanın.
Lambdalar, öznitelikleri kapsayan kapsamlarından devralır code_seg
. Lambda için bir kesim belirtmek için parameter-declaration yan tümcesinin ardından ve herhangi bir değiştirilebilir veya özel durum belirtiminin, sondaki dönüş türü belirtiminin ve lambda gövdesinin önüne bir code_seg
öznitelik uygulayın. Daha fazla bilgi için bkz . Lambda İfade söz dizimi. Bu örnek, PagedMem adlı bir segmentte bir lambda tanımlar:
auto Sqr = [](int t) __declspec(code_seg("PagedMem")) -> int { return t*t; };
Farklı segmentlere özel üye işlevleri, özellikle sanal üye işlevleri, yerleştirirken dikkatli olun. Temel sınıf yöntemi disk belleği olmayan bir kesimde bulunduğunda, sayfalandırılmış bir kesimde bulunan türetilmiş bir sınıfta sanal işlev tanımladığınız varsayalım. Diğer temel sınıf yöntemleri veya kullanıcı kodu, sanal yöntemi çağırmanın sayfa hatasını tetiklemeyeceğini varsayabilir.
Örnek
Bu örnekte, örtük ve açık şablon özelleştirmesi kullanıldığında özniteliğin segment yerleşimini nasıl code_seg
denetleyettiği gösterilmektedir:
// 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 Microsoft'a Özgü
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin