¿Qué gastos generales y otras consideraciones hay cuando se usa una estructura frente a una clase?

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

  • si recuerdo mi C ++ correctamente no hay diferencia entre struct y class además de la visibilidad predeterminada
  • Supongo que struct 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 .

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *