12 Mart 2018 Pazartesi

std::is_trivially_copyable

Giriş
Belirtilen tipin std::memcpy ile kullanılıp kullanılamayacağını belirtir. Açıklaması şöyle
std::is_trivially_copyable, which allows use of memcpy for both making a new object and modifying an existing one.
Bir başka açıklama şöyle
std::is_trivially_copyable answers if you copied this instance with a bytewise copy, would the result be the same as copying using a copy operator?
Açıklaması şöyle.
A trivially copyable class is a class that
 Has no non-trivial copy constructors (this also requires no virtual functions or virtual bases)
 Has no non-trivial move constructors
 Has no non-trivial copy assignment operators
 Has no non-trivial move assignment operators
 Has a trivial destructor
Örnek
Şöyle yaparız
#include <iostream>
#include <type_traits>
#include <tuple>

std::cout << std::is_trivially_copyable<std::tuple<int>>::value << std::endl;
std::cout << std::is_trivially_copyable<std::pair<int, int>>::value << std::endl;

std::cout << std::is_trivial<std::tuple<int>>::value << std::endl;
std::cout << std::is_trivial<std::pair<int, int>>::value << std::endl;
Çıktı olarak şunu alırız. Çünkü std::tuple ve std::pair'in içinde muhtemelen buffer için bellek var ve byte byte kopyalarsak doğrı çalışmaz
0
0
0
0
Örnek
Şöyle yaparız. Burada çıktı true, çünkü A nesnesi byte byte kopyalansa bile aynı nesneyi elde ederiz.
class A
{
    A() = default;
    A(const A&) = default;
    A(A&&) = default;
    A& operator=(const A&) = default;
    A& operator=(A&&) = default;
    ~A() = default;
    int a;
};

int main()
{
  std::cout << std::boolalpha <<
  ...
 std::is_trivially_copyable_v<A> << "\n";
 return 0;
}

Diğer
std::is_trivially_copyable_v metodu
Kodu şöyledir
template< class T >
inline constexpr bool is_trivially_copyable_v = is_trivially_copyable<T>::value; 

Hiç yorum yok:

Yorum Gönder