POD Parametreli Constructor Sunabilir
Bu bir POD tipidir.
Açıklaması şöyle. Sadece alanlar kopyalanır. Padding byte'ları kopyalanmaz.
Elimde bir POD olsun
POD constructor'ları exception fırlatamaz.
POD tipler memcpy ile kullanılabilir. Şöyle yaparız.
POD'larda memcmp kullanmak aslında çok iyi bir fikir değil. Çünkü kopyalama yaparken padding alanları kopyalanmayabilir. Açıklaması şöyle
Bu bir POD tipidir.
struct Object
{
int i;
double d;
Object(int ii, double dd) : i(ii), d(dd) {}
};
POD ve KopyalamaAçıklaması şöyle. Sadece alanlar kopyalanır. Padding byte'ları kopyalanmaz.
ÖrnekThe implicitly-defined copy/move constructor for a non-union class X performs a memberwise copy/move of its bases and members.
Elimde bir POD olsun
struct A {
char a;
int b;
};
Kopyalama yapalım. Sadece alanlar kopyalanır. Padding byte'ları kopyalanmaz.A x = ...;
A y =x;
İlla herşey kopyalansı istersek şöyle yaparız.
Şöyle yaparız. Daha detaylı bilgi için Brace Initialization - Aggregate yazısına bakılabilir.union A{ struct {
char a;
int b;
}; };
POD Aggreate Initialization Yapabilirclass A
{
public:
int x = 0, y = 0;
};
..
A a{1,2}; // using the sequence constructor created by the compiler, great
POD Constructor Exception FırlatmazPOD constructor'ları exception fırlatamaz.
int main()
{
int i; //will here throw exception?
}
POD ve memcpyPOD tipler memcpy ile kullanılabilir. Şöyle yaparız.
Object clone (Object o1)
{
char buf [sizeof(Object)];
memcpy(buf, &o1, sizeof(dest));
Object* ptr = reinterpret_cast<Object*>(dest);
return *ptr;
}
POD ve memcmpPOD'larda memcmp kullanmak aslında çok iyi bir fikir değil. Çünkü kopyalama yaparken padding alanları kopyalanmayabilir. Açıklaması şöyle
memcmp() between two objects of type struct{char c; int n;} will compare the padding bytes whose values may differ when the values of c and n are the same
Elimde bir POD olsun
Elimizde POD olsun.
struct A {
char a;
int b;
};
Kopyalama yapalım. Bu durumda memcmp() doğru çalışmayabilir.A x = ...;
A y =x;
POD ve SocketElimizde POD olsun.
struct outgoing_header
{
std::int32_t a;
std::int64_t b;
char c[SIZE};
};
Göndermek için şöyle yaparız.outgoing_header oh{...};
send(&oh, sizeof(oh));
Okumak için şöyle yaparız.constexpr static size_t max_size = ...;
char buf[max_size]{};
size_t got_bytes = receive(&buf, max_size);
// now we need to interpret these bytes as outgoing_header
outgoing_header* pheader = reinterpret_cast<outgoing_header*>(&buf[0]);
// now access the header items
pheader->a;
pheader->b;
Hiç yorum yok:
Yorum Gönder