Giriş
Gömülü projelerde C#'taki ArraySegment sınıfına benzer bir sınıf çok işe yarıyor. Gereksiz kopyalama yapmadan bir bellek alanının başını ve sonunu tek bir nesne halinde geçebiliyoruz.
Eğer C++20 kullanıyorsak std::span sınıfını kullanmak daha iyi
Örnek
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
Gömülü projelerde C#'taki ArraySegment sınıfına benzer bir sınıf çok işe yarıyor. Gereksiz kopyalama yapmadan bir bellek alanının başını ve sonunu tek bir nesne halinde geçebiliyoruz.
Eğer C++20 kullanıyorsak std::span sınıfını kullanmak daha iyi
Örnek
Şöyle yaparız.
template<class T>
struct span_t {
T* b =0;
T* e =0;
T* begin() const { return b; }
T* end() const { return e; }
std::size_t size() const { return end()-begin(); }
bool empty() const { return size()==0; }
T& operator[](std::size_t i) const { return b[i]; }
span_t()=default;
span_t(span_t const&)=default;
span_t& operator=(span_t const&)=default;
span_t( T* s, T* f ):b(s),e(f) {}
span_t( T* s, std::size_t l):span_t(s, s+l) {}
};
ÖrnekŞöyle yaparız.
#include <cstdint>
template<typename T>
class array_view {
T* ptr_;
std::size_t len_;
public:
array_view(T* ptr, std::size_t len) noexcept: ptr_{ptr}, len_{len} {}
T& operator[](int i) noexcept { return ptr_[i]; }
T const& operator[](int i) const noexcept { return ptr_[i]; }
auto size() const noexcept { return len_; }
auto begin() noexcept { return ptr_; }
auto end() noexcept { return ptr_ + len_; }
};
ÖrnekŞöyle yaparız.
template<typename T>
class span {
T* ptr_;
std::size_t len_;
public:
span(T* ptr, std::size_t len) noexcept
: ptr_{ptr}, len_{len}
{}
T& operator[](int i) noexcept {
return *ptr_[i];
}
T const& operator[](int i) const noexcept {
return *ptr_[i];
}
std::size_t size() const noexcept {
return len_;
}
T* begin() noexcept {
return ptr_;
}
T* end() noexcept {
return ptr_ + len_;
}
};
Hiç yorum yok:
Yorum Gönder