Aracılığıyla paylaş


__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 segnamebelirtilen 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ı .textbir 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.

__declspec
Anahtar Sözcükler