2013-05-10 1 views
1

que j'ai un struct commecopie d'un tampon dans une structure en langage C++ de style

typedef struct { 
    unsigned char flag, type; 
    unsigned short id; 
    uint32 size; 
} THdr; 

et un tampon de données provenant d'une comunication UDP, j'ai un tampon d'octets et sa taille (data et data_size) . la taille des données est supérieure à sizeof(THdr). La structure est au début du tampon, et je veux le copier dans une structure définie dans le code THdr Struct_copy. Je sais que je peux utiliser memcpy(&Struct_copy,data[0],sizeof(Struct_copy)); mais je voudrais utiliser un "style C++", comme en utilisant std::copy.

aucune idée?

+0

Si vous avez une implémentation en ligne simple, pourquoi la compliquer (et peut-être même ralentir) parce que vous voulez quelque chose de plus "stylé"? 'memcpy' est une bonne solution pour ça, c'est pour ça. –

+1

Utilisez 'std :: memcpy' à la place :-)' std :: 'le rend plus C++ ish! – deepmax

+0

parce qu'en fonction du compilateur memcpy peut être plus lent que std :: copy, au moins est ce qu'ils ont dit dans http://stackoverflow.com/questions/4707012/c-memcpy-vs-stdcopy – BiA

Répondre

1

Que diriez-vous quelque chose comme

THdr hdr; 
std::copy(&hdr, &hdr + 1, reinterpret_cast<THdr*>(data)); 

devrait copier une structure de THdr de data à hdr.

Il peut aussi être beaucoup plus simple:

THdr hdr; 
hdr = *reinterpret_cast<THdr*>(data); 

Ce dernier fonctionne en C ainsi:

THdr hdr; 
hdr = *(THdr *) data; 

Ou pourquoi ne pas créer un constructeur qui prend les données en entrée? Comme

struct THdr 
{ 
    explicit THdr(const unsigned char* data) 
     { 
      THdr* other = reinterpret_cast<THdr*>(data); 
      *this = *other; 
     } 

    // ... 
}; 

Ensuite, il peut être utilisé comme la

THdr hdr(data); 
+0

Est-ce que 'reinterpret_cast 'n'a pas de pénalité d'efficacité au moment de l'exécution? – deepmax

+0

@MM. Non, cela indique simplement au compilateur de traiter un type comme un autre type, c'est-à-dire qu'il devrait "réinterpréter" le type. –

+0

Peut-être que "réinterpréter" impose des coûts ... Cela coûte-t-il un temps de compilation ou d'exécution? Je suis un peu confus! – deepmax

2

Il n'y a pas « intelligent » façon de le faire en C++. Si cela n'implique pas memcpy, alors vous avez besoin de std::copy et vous devrez utiliser des conversions à const unsigned char * pour faire correspondre le type de données de la source et/ou de la destination.

Il existe plusieurs autres façons de "copier certaines données", comme le type-punning, mais encore une fois, ce n'est pas une "meilleure" solution que memcpy - juste différent. C++ a été conçu pour accepter le code C, donc s'il n'y a rien de mal avec votre code actuel, je ne vois pas pourquoi vous devriez le changer.

Questions connexes