önceden derlenmiş başlıklarla derleme nasıl hızlandırılır

Önceden derlenmiş başlıklar önemli ölçüde artabilir

derleme hızı…

C++ Oluşturucu Dil Kılavuzu

Giriş yerine hemen bir örnek vereceğim. Yaklaşık 170 cpp modülü içeren ve önceden derlenmiş başlıklar kullanan bir projenin eksiksiz bir şekilde oluşturulması 811 saniye alırken, derleyici tarafından işlenen satır sayısı 1.808.780’dir. Aynı projeyi önceden derlenmiş başlıklar kullanmadan derlerken, derleme süresi 2399 saniyedir ve derleyici tarafından işlenen satır sayısı 45.261.820’dir. Etkileyici, değil mi? Bu ivmenin fiyatı prensipte yüksek değil – boyutu yaklaşık 40 MB olan önceden derlenmiş bir görüntü.

Kaynakları derlerken, derleyici tüm *.cpp proje dosyalarını ve bunlara dahil edilen tüm *.h dosyalarını işlemelidir. Bu, hem özel başlık dosyalarını hem de vcl.h veya Word2k.h gibi standart başlık dosyalarını işler. Standart başlıklardaki kod miktarı çok büyük olabilir, örneğin Word2k.h dosyasının boyutu 5 MB’ın üzerindedir, 130.000’den fazla kod satırı içerir.

Standart başlıkların içeriği değişmediği için her proje yapıldığında bunları derlemek zaman kaybıdır. Önceden derlenmiş başlıklar bu sorunun çözülmesine yardımcı olur – standart dosyalar bir kez derlenir ve ardından derlenmiş ikili görüntü kullanılır.

Önceden derlenmiş başlıklar nasıl çalışır?

#pragma hdrstop derleyici yönergesi, önceden derlenmiş olanları kontrol etmek için kullanılır. Bu yönergeden önce dahil edilen tüm başlık dosyaları tek bir görüntüye yerleştirilir, örneğin:

#include

#include

#pragma hdrstop

Bu dizi, derlenmiş vcl.h ve dizeyi içeren bir görüntü oluşturacaktır. Bu görüntü, hdrstop yönergesinden önce aynı sırada, aynı dosyaları içeriyorsa başka bir cpp dosyası için kullanılacaktır. Sadece kompozisyonun değil, aynı zamanda başlıkların sırasının da önemli olduğunu belirtmeme izin verin – bir sonraki cpp dosyası aynı başlıkları içeriyor olsa bile, ancak önce string belirtilmiş ve ardından vcl.h, daha sonra yeni bir görüntü oluşturulacaktır. bu cpp dosyası.

Bu nedenle, önceden derlenmiş bir başlığı yeniden kullanmak için iki koşulun karşılanması gerekir:

    – hdrstop yönergesinden önce dahil edilen dosyaların bileşimi aynı olmalıdır

    – hdrstop yönergesinden önceki dosyaları dahil etme sırası aynı olmalıdır

Standart başlıkları derleme maliyetini minimumda tutmanın tek yolu, bir proje için gereken tüm standart başlıkları içeren tek bir görüntüyü derlemektir. Bu şunları gerektirir:

    – Projenin TÜM cpp dosyaları, hdrstop yönergesinden önce aynı ekleme bloğuna sahipti

    – bu blok proje için gerekli TÜM standart başlık dosyalarını içermelidir

Bu koşulları yerine getirmek oldukça basittir, bunun için her cpp dosyasının başına aşağıdaki satırlar yerleştirilmelidir: #include
#pragma hdrstop

burada pch.h, tüm standart başlıkların içermelerini içeren bir dosyadır: #ifndef PCH_H

#define PCH_H

#define INC_VCLDB_HEADERS

#define INC_VCLEXT_HEADERS

#include

#include

#include

#include

#include



#endif

Bu dosyanın benim versiyonumun tam metni makalenin sonundadır. Önceden derlenmiş görüntüde bulunan h dosyaları kısıtlanmıştır – başlatılmış verileri içermemelidirler, örneğin, math.hpp’de satırlar vardır:

statik sabit Genişletilmiş NaN = 0.0 / 0.0;

statik sabit Genişletilmiş Sonsuzluk = 1.0 / 0.0;

Bu sabitler nedeniyle, matematik.hpp’yi pch.h dosyasına ekleyemezsiniz.

Bu arada, C++ Builder, bir projeye yeni modüller eklerken, önceden derlenmiş başlıkları yönetmek için açıklanan stratejiyi uygular. Örneğin, yeni bir uygulama oluştururken Unit1.cpp dosyası şöyle olur: #include

#pragma hdrstop

#include “Birim1.h”

….

vcl.h’deki metne bakarsanız, bunun çok sayıda başka standart başlık dosyasını dahil etmek için bir sarmalayıcı olduğunu görebilirsiniz.

Özel karakterler (INC_VCLDB_HEADERS, INC_VCLEXT_HEADERS, vb.) kullanarak vcl.h’de bulunan başlıkların kompozisyonunu kontrol edebilirsiniz. Benim pch.h sürümümde, bu semboller vcl.h eklenmeden önce #define ile tanımlanır, bu da dahil edilen dosya sayısında artışa neden olur.

Mevcut bir projede önceden derlenmiş başlıkları kullanmaya nasıl geçilir?

Büyük bir projede bile önceden derlenmiş başlıklara geçiş yapmak yeterince kolaydır.

İlk adım, pch.h başlık dosyasının kendisini oluşturmaktır. Proje klasörüne yerleştirilmelidir, bu dosyanın içeriği makalenin sonunda verilmiştir.

Ardından, proje özelliklerinde önceden derlenmiş başlıkların önbelleğe alınmasını etkinleştirmeniz gerekir, ayrıca önceden derlenmiş başlıkların görüntüsünün saklanacağı bir “kişisel” dosya belirtmeniz önerilir: Proje – Seçenekler – Derleyici sekmesi, “Önceden derlenmiş başlıklar “grup. Burada “Cache pre-compiled headers” seçilmeli ve “Dosya Adı” alanına “pch.csm” girilmelidir. Bu ayarla, önceden derlenmiş başlıklara sahip görüntü, proje klasöründe, pch.csm dosyasında yer alacaktır.

Bundan sonra, her cpp modülünün başına 2 satır eklenmelidir: #include “pch.h”

#pragma hdrstop

Daha önce dahil edilen tüm başlık dosyaları yerlerinde kalır, onları silmeye gerek yoktur. Örneğin: #include “pch.h” // vcl.h, string vb. içerir.

#pragma hdrstop

#include

#include



Tüm standart başlıklarda yeniden dahil etme koruyucuları kullanıldığından, tekrar edilmeleri yeniden dahil edilmeyi gerektirmez.

Prensipte, pch.h kullanıldığında, standart başlıkları dahil etmek için teknik bir ihtiyaç yoktur. Bununla birlikte, her belirli modül için gerekli tüm başlıkları #pragma hdrstop yönergesinin altında belirtmek yine de yararlıdır. İlk olarak, modülü bir dereceye kadar belgeler – bu modülün hangi özellikleri kullandığını içerdiği dosyalara göre değerlendirebilirsiniz. İkincisi, modülün pch.h kullanmayan veya farklı içeriğe sahip diğer projelerde yeniden kullanılmasını kolaylaştırır.

Teorik olarak, pch.h’ye yalnızca standart değil, aynı zamanda tüm özel başlık dosyalarını da eklerseniz, derleme verimliliğini daha da artırabilirsiniz. Pratikte, özel başlıklar oldukça sık değiştiğinden, bu, derleme süresini olumsuz yönde etkileyecek olan pch.h’nin sık sık yeniden derlenmesine yol açabilir. Ayrıca, özel başlıklar genellikle çok büyük değildir ve çok hızlı derlenir. Bu nedenle, bunların pch.h’ye dahil edilmesi tavsiye edilmez.

Önceden derlenmiş başlıkların etkin bir şekilde kullanıldığını nasıl kontrol edebilirim?

Projeye yeni dosyalar eklerken, bunlara pch.h eklemeyi unutmamalısınız, aksi takdirde ortak önceden derlenmiş görüntü onlar için kullanılmayacaktır. Aynı durum, eğer bazı modüller, pch.h’ye dahil olmayan standart başlıklar içeriyorsa ortaya çıkabilir. Bu tür dosyaları izlemenin birkaç yolu vardır:

    – derleme sürecinin görsel gözlemi. Genellikle bir dosyada derlenen satır sayısı 10000-15000 satırı geçmemelidir.

    – proje için önceden derlenmiş başlıkların görüntüsünü depolamak için tek bir dosya seçilirse ve bu dosyaya pch.csm adı verilirse, pch.#00, pch.#01 adlarına sahip yardımcı dosyaların varlığına dikkat etmeniz gerekir. , vb. Tüm proje dosyaları için aynı önceden derlenmiş görüntü kullanılıyorsa, yalnızca bir yardımcı dosya olmalıdır – pch.#00. Bu tür daha fazla dosya varsa, bu, bazı cpp modülleri için ek görüntülerin oluşturulduğu anlamına gelir.

    – proje özelliklerinde (Proje -> Seçenekler -> Derleyici sekmesi) Genel Mesajları Göster seçeneğini etkinleştirin. Ardından, önceden derlenmiş başlıkların yüklenmesiyle ilgili bilgiler de dahil olmak üzere, derleme işlemi sırasında Mesajlar penceresinde ek bilgiler görüntülenecektir. Bir dosya için önceden derlenmiş bir görüntü yüklenirse, Mesajlar penceresi “[C++] Önceden derlenmiş başlıklar yüklendi”.

Metin pch.h #ifndef PCH_H

#define PCH_H

#define INC_VCLDB_HEADERS

#define INC_VCLEXT_HEADERS

#include

/* Önceki 3 satırla bağlanan her şey

// Çekirdek (minimum) Delphi RTL başlıkları

#include

#include

#include

#include

#include

#include

// Çekirdek (minimum) VCL başlıkları

#if tanımlı(INC_VCL)

#include

#include

#include

#include

#include

#include

// VCL Veritabanı ile ilgili başlıklar

#if tanımlı(INC_VCLDB_HEADERS)

#include

#include

#include

#endif // INC_VCLDB_HEADERS

// VCL başlıklarının tamamı

#if tanımlı(INC_VCLEXT_HEADERS)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#endif // INC_VCLEXT_HEADERS

#endif // INC_VCL

*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include
#include

#include

#include

#include

#include
#include

#include

#include

#include

#include

#include

#include

//standart olmayan RxLib ve EhLib bileşenleri

#include “CURREDIT.hpp”

#include “RXSpin.hpp”

#include “RxCalc.hpp”

#include “RxCombos.hpp”

#include “APPUTILS.hpp”

#include “RXDBCtrl.hpp”

#include “Placemnt.hpp”

#include “DBGridEh.hpp”

#endif

Yukarıdakiler hakkında

Sunulan materyal hakkında herhangi bir sorunuz veya yorumunuz varsa, onları kabul etmeye hazırım – yazın
seb.goo@gmail.com .

PS

Önceden derlenmiş başlıklarla ilgili bir sorun hakkında birkaç kez bildirildim – Oluşturucu “Dialogs.hpp(437): W8058 Önceden derlenmiş başlık oluşturulamıyor: başlıkta başlatılan veriler” uyarısını vermeye başlıyor ve önceden derlenmiş bir başlık oluşturmuyor .

Bunun ne olduğunu hala anlamıyorum, ancak Sergey Aleutdinov’un bana yazdığı gibi, bir geçici çözüm bulmayı başardı:

alıntı:

Sorun bir “geçici çözüm” ile çözüldü.

AllHeaders.hpp başlık dosyası oluşturdum, burada VCL olmayan tüm başlıkları (DevExpress, FIBPlus, kendi nadiren değiştirilen başlıklarım, vb.)

Her proje dosyasına üç satır ekledim:

#include

#include

#pragma hdrstop

Gitmiş gibi.

Similar Posts

Leave a Reply

Your email address will not be published.