Struct con funzioni usate come "raw buffer"

di
Anonimizzato6454
il
1 risposte

Struct con funzioni usate come "raw buffer"

Salve a tutti, è da un po' che ho un dubbio:
se creo una struct con delle funzioni ad esempio:

#	pragma pack(1)
struct persona{
   char nome[50];
   char cognome[50];
   
   void setNome(const char *n){
        strcpy(nome,n);
   }
   void setCognome(const char *c){
        strcpy(cognome,c);
   }
};
#	pragma pack()
e poi la uso in un modo del genere:

persona pers;
memset(&pers,0,sizeof(persona));
insomma la tratto come un area di memoria qualsiasi
potrei avere dei problemi?

un mio collega dice che se nella struct c'è qualcos'altro oltre alle variabili
lo standard non garantisce come viene allocata la memoria.

Pero ho visto che se non ci sono funzioni virtuali il sizeof(persona) è esattamente
uguale a 100 e chiaramente &pers==&pers.nome[0];
(ho fatto anche la prova sia con gcc che con visual c++)

Voi che ne pensate?

1 Risposte

  • Re: Struct con funzioni usate come "raw buffer"

    Visto che ho risolto mi rispondo da solo, magari torna utile a qualcuno:

    Per fare una cosa del genere senza rischi la struct deve rispondere alle specifiche POD(Plain Old Data).
    A type that consists of nothing but Plain Old Data.

    A POD type is a C++ type that has an equivalent in C, and that uses the same rules as C uses for initialization, copying, layout, and addressing.

    As an example, the C declaration struct Fred x; does not initialize the members of the Fred variable x. To make this same behavior happen in C++, Fred would need to not have any constructors. Similarly to make the C++ version of copying the same as the C version, the C++ Fred must not have overloaded the assignment operator. To make sure the other rules match, the C++ version must not have virtual functions, base classes, non-static members that are private or protected, or a destructor. It can, however, have static data members, static member functions, and non-static non-virtual member functions.

    The actual definition of a POD type is recursive and gets a little gnarly. Here's a slightly simplified definition of POD: a POD type's non-static data members must be public and can be of any of these types: bool, any numeric type including the various char variants, any enumeration type, any data-pointer type (that is, any type convertible to void*), any pointer-to-function type, or any POD type, including arrays of any of these. Note: data-pointers and pointers-to-function are okay, but pointers-to-member are not. Also note that references are not allowed. In addition, a POD type can't have constructors, virtual functions, base classes, or an overloaded assignment operator.
    fonte:
Devi accedere o registrarti per scrivere nel forum
1 risposte