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.