C en sistemas embebidos ha usado tradicionalmente estructuras para contener datos estructurados.
Arduino trae C ++ a la mesa, 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?
Sigo viendo que la técnica de estructura se usa mucho, ¿por qué?
Comentarios
Respuesta
Según la respuesta aceptada de ¿Cuándo debería usar una clase frente a una estructura en C ++?
La única diferencia entre una clase y una estructura en C ++ es que las estructuras tienen miembros públicos predeterminados y las bases y las clases tienen bases y miembros privados predeterminados. Tanto las clases como las estructuras pueden tener una mezcla de miembros públicos y privados, pueden usar herencia y pueden tener funciones miembro.
Recomendaría usar estructuras como estructuras de datos antiguos sin ninguna característica de clase, y el uso de clases como estructuras de datos agregadas 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.
Respuesta
A diferencia de C, una instancia de un struct
en C ++ es un objeto exactamente de la misma manera que una instancia de un 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 un struct
tienen visibilidad pública de forma predeterminada, mientras que los miembros de un class
tienen visibilidad privada de forma predeterminada. De lo contrario, todas las funciones del idioma funcionan de la misma manera en ambos, como constructores / destructores, herencia, polimorfismo, plantillas y sobrecarga de operadores. Incluso puede derivar un struct
de un class
, y viceversa al revés.
A pesar de la similitud, es bastante común ver a la gente usando deliberadamente un struct
en C ++ para estructuras muy simples, por ejemplo donde solo consta de algunos miembros de datos, pero no funciones. Un class
se 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.
Respuesta
Como han señalado otras respuestas, su struct
y class
en particular son indistinguibles en cuanto al rendimiento (existen ligeras diferencias en el alcances de los nombres de tipo, debido a la forma en que definiste tu estructura). La delimitación en C ++ no está entre struct
y class
, pero entre tipos que son POD (datos antiguos sin formato) y tipos que no lo son, como se explica en esta discusión .
Respuesta
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 instanciación crea un «objeto».
todavía veo que la técnica de estructura se usa mucho – ¿por qué es esto?
Teclea menos si » no está tratando de ocultar miembros de datos.
Respuesta
Tenga en cuenta que
typedef struct { ... } Foo;
está obsoleto en C ++ y debería usar
struct Foo { ... };
No está muy claro en las respuestas, pero el otro efecto de las estructuras es herencia pública por defecto vs herencia privada por defecto con clases.
Como han mencionado otros, el uso de struct es generalmente una convención para los tipos POD.
También técnicamente «struct vs object» debería ser «estructura vs clase» (como instanciar una estructura o una clase todavía da un objeto).
Comentarios
- Objeto de pregunta editado- > clase.
struct
yclass
además de la visibilidad predeterminadastruct
s se utilizan principalmente porque la gran mayoría del hardware integrado está codificado en C, por lo que cualquiera que dedique mucho tiempo a escribir código para MCU pequeñas probablemente conozca C mucho mejor que C ++, y alcanza automáticamente los modismos en C antes que los modismos en C ++. Es ' un problema de rendimiento del programador .