Quais sobrecargas e outras considerações existem ao usar uma estrutura em vez de uma classe?

C em sistemas embarcados tradicionalmente usa structs para armazenar dados estruturados.

Arduino traz C ++ para a mesa, para que possamos usar classes em vez disso.

Digamos que temos duas estruturas de dados diferentes que podem ser consideradas muito semelhantes:

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

e:

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

Em termos de memória, que diferença isso fará?

Ainda vejo a técnica de struct sendo usada intensamente – por que isso?

Comentários

  • se me lembro de meu C ++ corretamente não há diferença entre struct e class além da visibilidade padrão
  • Eu presumiria struct s são usados principalmente porque a grande maioria do hardware embarcado é codificado em C, então qualquer um que gaste muito tempo escrevendo código para pequenos MCUs provavelmente conhece C muito melhor do que C ++, e alcança automaticamente os idiomas C antes dos idiomas C ++. É ' um problema de desempenho do programador .

Resposta

Conforme tirado da resposta aceita de Quando você deve usar uma classe em vez de uma estrutura em C ++?

A única diferença entre uma classe e uma estrutura em C ++ é que as estruturas têm membros e bases públicos padrão e as classes têm membros e bases privados padrão. Ambas as classes e structs podem ter uma mistura de membros públicos e privados, podem usar herança e podem ter funções de membro.

Eu recomendaria usar structs como estruturas de dados simples e antigas sem quaisquer recursos de classe, e usando classes como estruturas de dados agregadas com dados privados e funções-membro.

Em termos de memória, o modificador de acesso não faz diferença e dadas as restrições de memória do Arduino, as pessoas são menos propensas a usar classes com hierarquias complexas, mas preferem as estruturas POD de qualquer forma.

Resposta

Diferente de C, uma instância de um struct em C ++ é um objeto exatamente da mesma maneira que uma instância de um class. Do ponto de vista do código compilado, eles são idênticos. Uso de memória, alinhamento, tempos de acesso, etc. são exatamente os mesmos (ou seja, não há overheads).

Do ponto de vista do programador, há uma diferença muito pequena. Membros de um struct têm visibilidade pública por padrão, enquanto membros de class têm visibilidade privada por padrão. Caso contrário, todos os recursos de idioma funcionam da mesma forma em ambos, como construtores / destruidores, herança, polimorfismo, modelos e sobrecarga de operador. Você pode até mesmo derivar um struct de um class e vice-versa versa.

Apesar da similaridade, é bastante comum ver pessoas usando deliberadamente um struct em C ++ para estruturas muito simples, por exemplo onde consiste apenas em alguns membros de dados, mas nenhuma função. Um class seria usado para qualquer coisa mais complexa. Isso é puramente uma questão de convenção ou preferência pessoal e pode ser usado como uma indicação sutil da complexidade pretendida da estrutura.

Resposta

Como outras respostas indicaram, seus struct e class específicos têm desempenho indistinguível (há pequenas diferenças no escopos dos nomes de tipo, devido à maneira como você definiu sua estrutura). A delimitação em C ++ não está entre struct e class, mas entre tipos que são POD (dados simples) e tipos que não são, conforme explicado nesta discussão .

Resposta

Em termos de memória, que diferença isso fará?

Nenhum. Structs e classes são a mesma coisa, diferindo apenas nos níveis de proteção, e a instanciação cria um “objeto”.

ainda vê a técnica de struct sendo usada intensamente – por que isso?

Menos digitação se você ” não está tentando ocultar membros de dados.

Resposta

Observe que

typedef struct { ... } Foo; 

é obsoleto em C ++ e você deve apenas usar

struct Foo { ... }; 

Não é muito claro nas respostas, mas o outro efeito das estruturas é herança pública por padrão vs herança privada por padrão com classes.

Conforme mencionado por outros, usar struct é geralmente uma convenção para tipos de POD.

Também, tecnicamente, “struct vs objeto” deve ser “struct vs class” (já que instanciar um struct ou classe ainda dá um objeto).

Comentários

  • Objeto de questão editado- > classe.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *