 |
Ver Mensagens sem resposta | Ver Tópicos Activos
| [ +/- ]
[ Data/Hora: 18 Mai 2013, 05:33 ]
|
|
| Autor |
Mensagem |
|
Fox Dark
|
Assunto da Mensagem: Referências (&) Ocupam Lugar na Memória??? Enviado: 15 Jul 2011, 19:41 |
|
Registado: 14 Nov 2002, 14:21 Mensagens: 304 Localização: Brasil
|
Ola amigos! Estou fazendo uma revisão de C++... Fique um bom tempo parado! E estudando me veio a seguinte dúvida! Sabemos que uma variável ocupa lugar na memória e que ponteiros são um tipo 'especial' de variáveis que foram projetos para trabalhar com endereços de memória... como o tipo int foi projeto para trabalhar com valores inteiros! Ok. Mas e as referências... elas se assemelham aos ponteiros mas será que ocupam lugar na memória ou são penas 'alias' em tempo de compilação que são resolvidos e dessa forma não ocupam lugar na memória!??? Se nós usar-mos o operador unário (&) conhecido como "o endereço de" em uma referência vamos pegar na verdade o endereço da variável que é referenciada pela referência... fiz um código para demonstrar! Code: #include <cstdlib> #include <iostream>
using namespace std;
int main(int argc, char** argv) { int var = 10; // inteiro int &ref = var; // referência int *ptr = &ref; // ponteiro! cout << "End. de VAR.:" << &var << endl; cout << "End. REF....:" << &ref << endl; cout << "End. PTR....:" << &ptr << endl; cout << "Valor de PTR:" << ptr << endl; cout << "Valor de VAR:" << *ptr << endl; cout << "Fim" << endl; return 0; }
A saída é a seguinte: Code: End. de VAR.:0x22ff08 End. REF....:0x22ff08 End. PTR....:0x22ff04 Valor de PTR:0x22ff08 Valor de VAR:10 Fim
Bem como vcs podem ver quando eu uso: &p ele me dá o endereço onde o ponteiro p está armazenado (0x22ff04)... Mas quando eu uso: &ref ele me dá o endereço: (0x22ff08) que é o mesmo o dá variável var: (0x22ff08)... Daí conclui que as referências não são armazenas na memória como ponteiros estou certo? Comentários são bem vindos!
_________________ Somente os mortos verão o fim da guerra.
_________________________
<img src="http://geocities.yahoo.com.br/eddieacd/Bars.GIF" border=0>
|
|
| Topo |
|
 |
|
PhGodinho
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 16 Jul 2011, 12:56 |
|
Registado: 16 Jul 2011, 12:47 Mensagens: 2
|
|
O que é armazenado na memória é só um ponteiro para aquela variável, não uma copia, que é o principio básico do &: Passar a variável sendo utilizada para que seja modificada dentro das funções SEM criar uma cópia, otimizando e obtendo o resultado desejado.
Que eu lembre o & do C++ é só uma facilitação, se você usar C vai ter que passar um ponteiro comum *.
|
|
| Topo |
|
 |
|
Fox Dark
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 16 Jul 2011, 16:21 |
|
Registado: 14 Nov 2002, 14:21 Mensagens: 304 Localização: Brasil
|
Caro amigo PhGodinho, acho que tu não leu o texto quando diz: Quote: O que é armazenado na memória é só um ponteiro para aquela variável, não uma copia, que é o principio básico do &:
Quando vc diz que é armazenado na memória então quer dizer que é alocado espaço na memória para conter esse endereço de uma outra varíavel... Mas como foi demonstrado o uso do & em: Code: End. de VAR.:0x22ff08 End. REF....:0x22ff08
Os dois endereços são os mesmo então não foi criado armazenamento para essa referência. Esse é ponto da questão. Já com o ponteiro foi alocado na memória um espaço para armazenar o endereço para o qual o ponteiro aponta... Desta forma como havia tido antes, me parece que não é alocado qualquer espaço para armazenar a referência??? É essa a minha dúvida.
_________________ Somente os mortos verão o fim da guerra.
_________________________
<img src="http://geocities.yahoo.com.br/eddieacd/Bars.GIF" border=0>
|
|
| Topo |
|
 |
|
LeandroAp
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 16 Jul 2011, 18:46 |
|
Registado: 02 Out 2003, 10:17 Mensagens: 164 Localização: Brasil
|
|
Os endereços são os mesmos pois o compilador não permite acessar o valor do ponteiro. As referencias são como "ponteiros de alto nível", ela aponta para um local da memória da mesma forma de um ponteiro, porém você a usa exatamente como uma variável normal.
|
|
| Topo |
|
 |
|
Fox Dark
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 16 Jul 2011, 18:58 |
|
Registado: 14 Nov 2002, 14:21 Mensagens: 304 Localização: Brasil
|
|
Sim mas minha pergunta é! ela está armazenada em algum lugar? ou é uma alias apenas em tempo de compilação?
Por que entendo que se ela está armazenada de fato em algum lugar na memória e o compilar "safadiiinho" não me permiti acessar esse endereço com o operador & então deve haver em algum lugar uma regra que diga algo como:
"Quando se usa o operador unário & 'o endereço de' com uma referência o compilador informa a posição de memória onde a variável referenciada se encontra e não o endereço de onde a referência se encontra"
Só que nunca ouvi falar nessa regra e por isso minha dúvida! É isso mesmo?
_________________ Somente os mortos verão o fim da guerra.
_________________________
<img src="http://geocities.yahoo.com.br/eddieacd/Bars.GIF" border=0>
|
|
| Topo |
|
 |
|
LeandroAp
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 16 Jul 2011, 21:07 |
|
Registado: 02 Out 2003, 10:17 Mensagens: 164 Localização: Brasil
|
|
Ele ocupa espaço da mesma forma que o ponteiro, na verdade ele é um ponteiro, mas o compilador esconde isso pois ele faz a desreferência desse ponteiro automaticamente sempre que ele é usado, enquanto que no ponteiro normal você tem que fazer isso manualmente.
|
|
| Topo |
|
 |
|
|
The following user would like to thank LeandroAp for his or her post: Visitante |
 |
|
Fox Dark
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 16 Jul 2011, 21:10 |
|
Registado: 14 Nov 2002, 14:21 Mensagens: 304 Localização: Brasil
|
|
Como disse o compilador é "safadiiinho" e esconde isso! Então é isso obrigado pela ajuda e até a próxima!
_________________ Somente os mortos verão o fim da guerra.
_________________________
<img src="http://geocities.yahoo.com.br/eddieacd/Bars.GIF" border=0>
|
|
| Topo |
|
 |
|
fpissarra
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 17 Jul 2011, 09:58 |
|
Registado: 02 Jun 2011, 22:24 Mensagens: 167
|
LeandroAp Escreveu: Ele ocupa espaço da mesma forma que o ponteiro, na verdade ele é um ponteiro, mas o compilador esconde isso pois ele faz a desreferência desse ponteiro automaticamente sempre que ele é usado, enquanto que no ponteiro normal você tem que fazer isso manualmente. Talvez uma forma melhor de explicar isso seja a sequinte: Referências, em C++, podem se comportar de duas maneiras. Como se fossem ponteiros ou como se fossem "apelidos", dependendo de como sejam usadas. Nos exemplos mostrados: Code: int a = 10; int& b = a; A referência 'b' é apenas um "apelido", um "alias", para a variável 'a' e não ocupa espaço algum na memória ('a' ocupa, 'b' não). Mas, no exemplo abaixo: Code: void f(int& x) { x += 10; } O parâmetro 'x' é um ponteiro "maquiado", já que não precisamos usar a notação ou aritimética de ponteiros dentro da função quando é feita uma referência a 'x'. Eu acho que, fora do contexto dos operadores sobrecarregados e do construtor de cópia, em C++, as referências causam mais confusão do que ajudam. Prefiro usar ponteiros. []s Fred
|
|
| Topo |
|
 |
|
LeandroAp
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 17 Jul 2011, 11:01 |
|
Registado: 02 Out 2003, 10:17 Mensagens: 164 Localização: Brasil
|
Isso pode variar de acordo com o compilador, por exemplo, dado o seguinte código: Code: int i = 10; int &r = i; int *p = &i;
Compilando esse código com o VC++ 2010 em modo Debug e olhando ele em um disassembler você vai ver que a referencia e o ponteiro usam exatamente as mesmas instruções, porém em modo Release ele otimiza isso e passa a nem mesmo usar a referencia, alias, se você compilar apenas isso em Release ele remove todo esse código que não faz nada. Referencias no C++ é o que chamam de "Syntatic Sugar", é um ponteiro que age como se não fosse um ponteiro, tudo por trabalho do compilador, e o melhor é que sempre que possível o compilador nem mesmo vai usar um ponteiro, otimizando o código.
|
|
| Topo |
|
 |
|
bcsanches2
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 17 Jul 2011, 11:07 |
|
Registado: 23 Nov 2003, 18:58 Mensagens: 2807 Localização: Brasil
|
Quote: Que eu lembre o & do C++ é só uma facilitação, se você usar C vai ter que passar um ponteiro comum *. Quote: Eu acho que, fora do contexto dos operadores sobrecarregados e do construtor de cópia, em C++, as referências causam mais confusão do que ajudam. Prefiro usar ponteiros. Tem muita coisa implícita numa referência que um ponteiro não possui e por isso facilitam a vida: 1 - referências não podem ser null (a não ser com o uso de gambiarras) e tem que sempre serem inicializadas 2 - referências não podem ser modificadas 3 - Você não pode "deletar" uma referência Isso implica em muita coisa, tipo: Code: void func(MinhaClasse &objeto); void func2(MinhaClasse *objeto); [code]
Em func sempre terei que passar como parâmetro uma instância valida de um objeto, já em func2 surgem questões: posso passar null tb? func2 é responsável pela memória?
Eu pelo contrário só uso ponteiros quando realmente necessário.
Outro exemplo: [code] MinhaClasse &func();
Aqui fica claro que func sempre vai retornar uma referência para algo valido e que não é sua responsabilidade liberar essa memória. Agora sim, referências sempre vão ocupar espaço, o mesmo que um ponteiro. Quote: Referencias no C++ é o que chamam de "Syntatic Sugar", é um ponteiro que age como se não fosse um ponteiro, tudo por trabalho do compilador, e o melhor é que sempre que possível o compilador nem mesmo vai usar um ponteiro, otimizando o código. Referências não são apenas syntax sugar. Syntax sugar é algo que automatiza uma operação feita de outra maneira. Como o foreach do C#. Referências são uma extensão da linguagem, são quase como ponteiros, mas possuem restrições como as que mencionei que fazem total diferença e não tem como fazer outra forma. Sobre otimizações, me modo release o compilador otimiza ponteiros também e se possível os remove. Mas como referências possuem muito mais restrições que ponteiros, certamente são mais simples de se otimizar. T+
_________________ Quer aprender a fazer jogos? http://www.pontov.com.br/ Meus jogos
|
|
| Topo |
|
 |
|
danielf
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 18 Jul 2011, 01:13 |
|
Registado: 20 Jan 2003, 00:15 Mensagens: 502 Localização: Rio de Janeiro
|
Quote: Eu pelo contrário só uso ponteiros quando realmente necessário. Um padrao cada vez mais utilizado (inclusive eh o padrao da Google) eh o de passar como parametros apenas referencias constantes (const A& a), nunca referencias simples. A razao para isso eh: quando voce ve uma chamada de funcao como faz_algo(x), sem saber como funciona a funcao faz_algo, voce mais ou menos assume que essa nao alterara o valor de x (compare com faz_algo(&x)). Ou seja, se A for um tipo grande, o padrao seria: Code: int faz_algo(const A& a); // faz_algo garantidamente nao altera "a" int faz_algo2(A* a); // faz_algo2 pode alterar "a" int faz_algo3(A& a); // nunca faca isso!
|
|
| Topo |
|
 |
|
bcsanches2
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 18 Jul 2011, 08:49 |
|
Registado: 23 Nov 2003, 18:58 Mensagens: 2807 Localização: Brasil
|
Quote: Um padrao cada vez mais utilizado (inclusive eh o padrao da Google) eh o de passar como parametros apenas referencias constantes (const A& a), nunca referencias simples. O mesmo serve para ponteiros.... Alias, sempre usar referências e const (a não ser em tipos primitivos que não vale o custo de passar por referência, se não for uma situação onde se deseja alterar o valor original). Só tirar o const quando não for possível e só usar ponteiros quando não houver outro jeito. T+
_________________ Quer aprender a fazer jogos? http://www.pontov.com.br/ Meus jogos
|
|
| Topo |
|
 |
|
danielf
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 18 Jul 2011, 14:25 |
|
Registado: 20 Jan 2003, 00:15 Mensagens: 502 Localização: Rio de Janeiro
|
O que eu quis dizer eh: Se for para tirar o const da referencia, use ponteiros. Mesmo que seja possivel fazer com referencias. Em outras palavras, sempre que usar referencias, use const. Aqui esta o link para o padrao do Google (essa parte especifica): http://google-styleguide.googlecode.com ... _Arguments
|
|
| Topo |
|
 |
|
bcsanches2
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 18 Jul 2011, 14:39 |
|
Registado: 23 Nov 2003, 18:58 Mensagens: 2807 Localização: Brasil
|
Quote: O que eu quis dizer eh: Se for para tirar o const da referencia, use ponteiros. Mesmo que seja possivel fazer com referencias. Em outras palavras, sempre que usar referencias, use const. Agora entendi o que quis dizer. Na verdade isso ajuda em algo que sempre me incomodou nas referências, que é o fato de você olhar uma chamada de função e nunca saber se o valor esta sendo passado por referência ou não.
_________________ Quer aprender a fazer jogos? http://www.pontov.com.br/ Meus jogos
|
|
| Topo |
|
 |
|
fpissarra
|
Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória??? Enviado: 18 Jul 2011, 15:01 |
|
Registado: 02 Jun 2011, 22:24 Mensagens: 167
|
LeandroAp Escreveu: Compilando esse código com o VC++ 2010 em modo Debug e olhando ele em um disassembler você vai ver que a referencia e o ponteiro usam exatamente as mesmas instruções, porém em modo Release ele otimiza isso e passa a nem mesmo usar a referencia, alias, se você compilar apenas isso em Release ele remove todo esse código que não faz nada. Leandro, se for considerar o código gerado sem otimizações, então TODAS as variáveis são ponteiros "indiretos"... Por exemplo: Uma variável local: Code: { int a;
/* Faz algo com 'a' aqui. */ } Sem a otimização 'a' é referenciada provavelmente como: Code: mov eax,[ebp+4] Onde EBP é o ponteiro base para a pilha. Num código otimizado essa referência pode sumir, com o compilador usando um dos registradores para conter a variável durante o tempo de vida da função. Isso também acontece com variáveis globais, onde a referência pode ser: Code: mov eax,[x] ; sintaxe do NASM! Aqui 'x' é o endereço da variável - um "ponteiro constante", por assim dizer... Não é isso que eu quis dizer sobre aliases e ponteiros. Considero apenas o código otimizado para essa explicação. Quote: Referencias no C++ é o que chamam de "Syntatic Sugar", é um ponteiro que age como se não fosse um ponteiro, tudo por trabalho do compilador, e o melhor é que sempre que possível o compilador nem mesmo vai usar um ponteiro, otimizando o código. Com isso eu concordo!  []s Fred
|
|
| Topo |
|
 |
Quem está ligado: |
Utilizadores a ver este Fórum: Majestic-12 [Bot] e 2 visitantes |
|
Criar Tópicos: Proibído Responder Tópicos: Proibído Editar Mensagens: Proibído Apagar Mensagens: Proibído
|
|
 |
|

|
 |