Yazılım geliştirme: C++17 ile özel ayırıcılar
Son yazımda “Yazılım Geliştirme: C++17 ile Polimorfik Ayırıcılar” C++17’de polimorfik ayırıcılar teorisini tanıttım. Bugün teoriyi uygulayacağım.
Duyuru

Rainer Grimm uzun yıllardır yazılım mimarı, ekip ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanıyor, aynı zamanda özel konferanslarda sık sık konuşmaktan da hoşlanıyor. Modern C++ adlı blogunda C++ tutkusunu yoğun bir şekilde ele alıyor.
Devam etmeden önce son yazım olan “Yazılım Geliştirme: C++17 ile Polimorfik Ayırıcılar” makalemin en önemli kısımlarını burada bulabilirsiniz.
Hızlı bir hatırlatma
Aşağıdaki program polimorfik ayırıcıları kullanır:
// polymorphicAllocator.cpp
#include <array>
#include <cstddef>
#include <memory_resource>
#include <vector>
int main() {
std::array<std::byte, 200> buf1; // (1)
std:
buf1.size()};
std:
for (int i = 0; i < 5; ++i) {
myVec1.push_back(i);
}
char buf2[200] = {}; // (2)
std:
std::size(buf2)};
std:
for (int i = 0; i < 200; ++i) {
myVec2.push_back(i);
}
}
Şimdi kalkmak istiyorum myVec2 odak. 200 intaçık olacak std:
Bir izleme ayırıcısı
Aşağıdaki program bir öncekini temel alır, bir izleme ayırıcısı kullanır ve dinamik bellek ayırmayı ve ayırmayı kaldırmayı görünür hale getirir.
// trackAllocator.cpp
#include <array>
#include <cstdlib>
#include <format>
#include <iostream>
#include <memory_resource>
#include <vector>
class TrackAllocator : public std:
void* do_allocate(std::size_t bytes,
std::size_t alignment) override {
void* p = std:
allocate(bytes, alignment);
std::cout <<
std::format(" do_allocate: {:6} bytes at {}n",
bytes, p);
return p;
}
void do_deallocate(void* p,
std::size_t bytes,
std::size_t alignment) override {
std::cout <<
std::format(" do_deallocate: {:4} bytes at {}n",
bytes, p);
return
std:
deallocate(p, bytes, alignment);
}
bool do_is_equal(const std:
const noexcept override {
return std:
}
};
int main() {
std::cout << 'n';
TrackAllocator trackAllocator; // (1)
std:
std::cout << "myVec1n";
std::array<std::byte, 200> buf1;
std:
buf1.size()};
std:
for (int i = 0; i < 5; ++i) {
myVec1.push_back(i);
}
std::cout << "myVec2n";
char buf2[200] = {};
std:
std::size(buf2)};
std:
for (int i = 0; i < 200; ++i) {
myVec2.push_back(i);
}
std::cout << 'n';
}
TrackAllocator bellek tahsisini ve serbest bırakılmasını takip eden bir ayırıcıdır. Arayüz sınıfından gelir std:

C++20 ile tanıtılan kavramlar, Ranges kitaplığı, modüller ve eşyordamlar ile birlikte modern C++ uygulamaları oluşturmanın yolunu yeniden tanımladı. itibaren 7 – 9 Kasım 2023 arası Rainer Grimm, yoğun C++20 atölyesinde size hız kazandırıyor: yeni kavramlar kapsamlı bir şekilde açıklanıyor ve C++20’nin beraberinde getirdiği birçok kullanışlı özellik ayrıntılı olarak ele alınıyor.
Biz bunu somutlaştırıyoruz TrackAllocator (satır 1) ve onu varsayılan kaynak (2) yapın. myVec1 (3) e myVec2 (4) bunu yukarı akış ayırıcısı olarak kullanın. Bu ayırıcı, birincil ayırıcı tüketildiğinde devreye girer. Bu geri dönüş şunun içindir: myVec1 için gerekli değil myVec2 Fakat sevimli.
Bu çıktı, dinamik tahsisi ve serbest bırakılmasını gösterir. myVec2Değin std:

Belirli bir kaba bir yukarı akış ayırıcısı da eklenebilir.
Tahsis etmeyen bir tahsis edici
std:
// nullMemoryResource.cpp
#include <array>
#include <cstddef>
#include <iostream>
#include <memory_resource>
#include <string>
#include <vector>
int main() {
std::cout << 'n';
std::array<std::byte, 2000> buf;
std:
buf.size(), // (1)
std:
std:
try {
for (int i = 0; i < 100; ++i) { // (3)
std::cerr << i << " ";
myVec.emplace_back("A short string");
}
}
catch (const std::bad_alloc& e) { // (4)
std::cerr << 'n' << e.what() << 'n';
}
std::cout << 'n';
}
İlk önce yığına bellek ayırıyorum ve başlatıyorum std:

Sıradaki ne?
THE std:
(kendim)
Haberin Sonu