Dúvida básica sobre ponteiros. [RESOLVIDO]

1. Dúvida básica sobre ponteiros. [RESOLVIDO]

rob
robgeek

(usa Debian)

Enviado em 13/09/2015 - 20:20h

Boa noite!

Estou aprendendo c/c++ e queria tirar uma dúvida sobre ponteiros de objetos e objetos, pelo que eu entendi funciona assim:

Digamos que eu tenha um objeto, e nele várias atributos e uma enorme matriz. Se eu passar esse objeto como argumento de uma função, a função que receberá ele na verdade receberá uma cópia desse objeto. Não é? Isso significa que eu dobrarei o meu consumo de memória para um único objeto. Não seria mais econômico eu passar um ponteiro contendo o endereço de memória desse objeto para a função?

Obrigado!


  


2. MELHOR RESPOSTA

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 13/09/2015 - 20:32h

Depende do uso.

Se for para modificar o objeto principal, utiliza-se ponteiro. Agora se quiser ter uma cópia do objeto e operar com ela, utilize ela normal.

Porem tem como usar um objeto 'não ponteiro' e colocar ele numa funcao de ponteiros (vice-versa). Exemplo:


class Suvaco{
/* ... */
};

void ehBom(Suvaco *p){
/* O que for modificado aqui serah modificado no objeto ... */
}

void naoEhBom(Suvaco p){
/*
O que for modificado nao aqui serah modificado no objeto ...
*/
}

int main(){
Suvaco *peludo = new Suvaco();

ehBom(peludo);

Suvaco p();

naoEhBom(p);

// Agora usando ao contrario...

ehBom(&p); // Enviando o endereco de memoria, ou seja, vc 'tera' um ponterio

naoEhBom(*peludo); // Enviando o conteudo, ou seja, vc tera um objeto 'nao-ponteiro'

/*...*/

return 0;
}


Espero ter ajudado

[]'s

T+

--

body@human: $ sudo su
brain@human: # apt-get purge -y windows* && echo "Windows removed successfully"



3. Re: Dúvida básica sobre ponteiros.

rob
robgeek

(usa Debian)

Enviado em 13/09/2015 - 21:24h

Eu não quero modificar nada no meu objeto. Nele, eu tenho uma matriz que é bem grande. Eu quero, por exemplo mandá-lo para um método que vai mostrar esses dados da matriz em uma tabela com interface gráfica, e também vou mandar esse objeto para quase uma dezena de métodos.

Pelo que eu entendi, se eu mandar ele normalmente, cada método faria uma cópia desse objeto e consequentemente dessa enorme matriz, o que consumiria muito mais memória levando em conta que são quase dez métodos diferentes. Já, se eu mandasse o endereço de memória dele, eu teria apenas um objeto e todos os métodos acessariam ele. Isso me pouparia muita memória. Claro que eu preciso ter cuidado na manipulação dos dados, mas fora isso, o uso de ponteiros nesse caso me parece bem indicado.

Ou estou errado?


4. Re: Dúvida básica sobre ponteiros. [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/09/2015 - 11:30h

robgeek escreveu:

Eu não quero modificar nada no meu objeto. Nele, eu tenho uma matriz que é bem grande. Eu quero, por exemplo mandá-lo para um método que vai mostrar esses dados da matriz em uma tabela com interface gráfica, e também vou mandar esse objeto para quase uma dezena de métodos.


Quando você fala em “método”, entendo que você está tão-somente se referindo a qualquer função, seja ela membro de uma classe (ou “método” de um objeto dessa classe) ou uma função desvinculada de qualquer classe, certo?

Nada o impede de usar qualquer argumento de função por meio de ponteiros. Em particular, você a função pode declarar que o tipo do argumento é um ponteiro para dados constantes, quando oferecer a quem a chama a garantia de que não vai modificar o dado apontado.

Pelo que eu entendi, se eu mandar ele normalmente, cada método faria uma cópia desse objeto e consequentemente dessa enorme matriz, o que consumiria muito mais memória levando em conta que são quase dez métodos diferentes. Já, se eu mandasse o endereço de memória dele, eu teria apenas um objeto e todos os métodos acessariam ele. Isso me pouparia muita memória. Claro que eu preciso ter cuidado na manipulação dos dados, mas fora isso, o uso de ponteiros nesse caso me parece bem indicado.

Ou estou errado?


Fiquei com a impressão de que você está com medo de que, se tiver N funções usando o objeto que contém a matriz, o programa terá de reservar N+1 vezes espaço para o mesmo objeto. Não é bem o caso, mas a coisa pode até ser pior do que isso.

Na passagem por valor, os objetos passados como argumento são alocados na pilha a cada chamada de função realizada (e liberados quando a função termina). Como a pilha costuma ter mais restrições do que a memória estática e a memória livre (também chamada de heap), especialmente em ambientes com múltiplas threads, esse é um fator que você deve considerar na hora de escolher entre passar uma cópia do dado ou uma cópia para o endereço do dado.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts