¿Qué gastos generales y otras consideraciones existen al usar una estructura vs una clase?

16

C en sistemas embebidos ha usado tradicionalmente estructuras para mantener datos estructurados.

Arduino trae C ++ a la tabla, por lo que podemos usar clases en su lugar.

Digamos que tenemos dos estructuras de datos diferentes que podrían considerarse muy similares:

typedef struct 
{
    int valueOne;
    int valueTwo;
    int valueThree;
} value_t;

y:

class Value
{
    public:
        int valueOne;
        int valueTwo;
        int valueThree;
}

En términos de memoria, ¿qué diferencia hará esto?

Todavía veo que la técnica de estructura se usa mucho, ¿por qué es esto?

Cybergibbons
fuente
55
Si recuerdo mi C ++ correctamente, no hay diferencia entre structy classademás de la visibilidad predeterminada
Ratchet Freak
44
Supongo que los structs se usan principalmente porque la gran mayoría del hardware embebido está codificado en C, por lo que cualquiera que pase mucho tiempo escribiendo código para MCU pequeñas probablemente conozca C mucho mejor que C ++, y automáticamente busca modismos C antes que modismos C ++. Es un problema de rendimiento del programador .
Connor Wolf

Respuestas:

12

Según la respuesta aceptada de ¿ Cuándo debería usar una clase vs una estructura en C ++?

La única diferencia entre una clase y una estructura en C ++ es que las estructuras tienen miembros y bases públicas predeterminados y las clases tienen miembros y bases privados predeterminados. Ambas clases y estructuras pueden tener una mezcla de miembros públicos y privados, pueden usar herencia y pueden tener funciones de miembro.

Recomendaría usar estructuras como estructuras de datos antiguos sin ninguna característica de clase, y usar clases como estructuras de datos agregados con datos privados y funciones miembro.

En cuanto a la memoria, el modificador de acceso no hace ninguna diferencia y, dadas las limitaciones de memoria del Arduino, es menos probable que las personas usen clases con jerarquías complejas, pero prefieren las estructuras POD de todos modos.

monstruo de trinquete
fuente
5

A diferencia de C, una instancia de a structen C ++ es un objeto exactamente de la misma manera que una instancia de a class. Desde el punto de vista del código compilado, son idénticos. El uso de la memoria, la alineación, los tiempos de acceso, etc. son exactamente los mismos (es decir, no hay gastos generales).

Desde el punto de vista del programador, hay una diferencia muy pequeña. Los miembros de a structtienen visibilidad pública de forma predeterminada, mientras que los miembros de a classtienen visibilidad privada de forma predeterminada. De lo contrario, todas las características del lenguaje funcionan igual en ambos, como constructores / destructores, herencia, polimorfismo, plantillas y sobrecarga de operadores. Incluso puede derivar a structde a class, y viceversa.

A pesar de la similitud, es bastante común ver personas que usan deliberadamente a structen C ++ para estructuras muy simples, por ejemplo, donde solo consta de unos pocos miembros de datos, pero no funciones. A classse usaría para cualquier cosa más compleja. Sin embargo, esto es puramente una cuestión de convención o preferencia personal, y puede usarse como una indicación sutil de la complejidad prevista de la estructura.

Peter Bloomfield
fuente
4

Como han señalado otras respuestas, su rendimiento particular structe classindistinguible es sabio (existen ligeras diferencias en los ámbitos de los nombres de tipo, debido a la forma en que definió su estructura). La delineación en C ++ no es entre structy class, sino entre tipos que son POD (datos antiguos simples) y tipos que no lo son, como se explica en esta discusión .

microtherion
fuente
3

En términos de memoria, ¿qué diferencia hará esto?

Ninguna. Las estructuras y las clases son lo mismo, difieren solo en los niveles de protección, y la creación de instancias crea un 'objeto'.

Todavía veo que la técnica de estructura se usa mucho, ¿por qué es esto?

Menos escribir si no está tratando de ocultar miembros de datos.

Barro
fuente
2

Tenga en cuenta que

typedef struct { ... } Foo;

es obsoleto en C ++ y solo debes usar

struct Foo { ... };

No está muy claro en las respuestas, pero el otro efecto de las estructuras es la herencia pública por defecto frente a la herencia privada por defecto con las clases.

Como mencionan otros, el uso de struct es generalmente una convención para los tipos de POD.

También técnicamente 'struct vs object' debería ser 'struct vs class' (como instanciar una estructura o una clase todavía da un objeto).

codah
fuente
Pregunta editada objeto-> clase.
Cybergibbons