Quais despesas gerais e outras considerações existem ao usar uma estrutura versus uma classe?

16

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

O Arduino traz C ++ para a tabela, para que possamos usar classes.

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á?

Eu ainda vejo a técnica struct sendo usada fortemente - por que isso?

Cybergibbons
fonte
5
se bem me lembro o meu C ++ corretamente, não há diferença entre structe classalém do padrão visibilidade
aberração catraca
4
Eu diria que structs são usados ​​principalmente porque a grande maioria do hardware incorporado é codificada em C; portanto, qualquer pessoa que gaste muito tempo escrevendo código para MCUs pequenos provavelmente conhece C muito melhor que C ++ e acessa automaticamente os idiomas C antes dos idiomas C ++. É um problema de desempenho do programador .
Connor Lobo

Respostas:

12

Conforme extraído da resposta aceita em Quando você deve usar uma classe versus uma estrutura em C ++?

A única diferença entre uma classe e uma estrutura no 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 estruturas podem ter uma mistura de membros públicos e privados, podem usar herança e podem ter funções de membro.

Eu recomendaria o uso de estruturas como estruturas simples de dados antigos, sem nenhum recurso semelhante a uma classe, e o uso de classes como estruturas agregadas de dados 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, é menos provável que as pessoas usem classes com hierarquias complexas, mas preferem as estruturas de POD de qualquer maneira.

catraca arrepiante
fonte
5

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

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

Apesar da semelhança, é bastante comum ver pessoas usando deliberadamente um structC ++ em estruturas muito simples, por exemplo, onde ele consiste apenas de alguns membros de dados, mas sem funções. A classseria usado para algo mais complexo. Porém, isso é apenas uma questão de convenção ou preferência pessoal e pode ser usado como uma indicação sutil da complexidade pretendida da estrutura.

Peter Bloomfield
fonte
4

Como outras respostas apontaram, seu desempenho particular structe classé indistinguível em termos de desempenho (existem pequenas diferenças nos escopos dos nomes dos tipos, devido à maneira como você definiu sua estrutura). O delineamento em C ++ não é entre structe class, mas entre tipos que são POD (dados antigos simples) e tipos que não são, conforme explicado nesta discussão .

microtherion
fonte
3

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

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

ainda vejo a técnica struct sendo usada fortemente - por que isso?

Menos digitação se você não estiver tentando ocultar membros de dados.

Lama
fonte
2

Observe que

typedef struct { ... } Foo;

está obsoleto em C ++ e você deve apenas usar

struct Foo { ... };

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

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

Tecnicamente também 'struct vs object' deve ser 'struct vs class' (como instanciar uma struct ou uma classe ainda fornece um objeto).

codah
fonte
Objeto da pergunta editada-> classe.
21414 Cybergibbons