[ +/- ] [ Data/Hora: 18 Mai 2013, 05:33 ]


Criar um novo TópicoWrite comments Página 1 de 2   [ 16 posts ]
Ir para página 1, 2  Próximo
Autor Mensagem
 Assunto da Mensagem: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 15 Jul 2011, 19:41 
Membro Sênior

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
 Perfil  
 
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 16 Jul 2011, 12:56 
Membro

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
 Perfil  
 
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 16 Jul 2011, 16:21 
Membro Sênior

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
 Perfil  
 
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 16 Jul 2011, 18:46 
Membro Ativo

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
 Perfil  
 
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 16 Jul 2011, 18:58 
Membro Sênior

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
 Perfil  
 
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 16 Jul 2011, 21:07 
Membro Ativo

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
 Perfil  
 
The following user would like to thank LeandroAp for his or her post: Visitante
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 16 Jul 2011, 21:10 
Membro Sênior

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
 Perfil  
 
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 17 Jul 2011, 09:58 
Membro Ativo

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
 Perfil  
 
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 17 Jul 2011, 11:01 
Membro Ativo

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
 Perfil  
 
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 17 Jul 2011, 11:07 
Membro Avançado

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
 Perfil  
 
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 18 Jul 2011, 01:13 
Membro Sênior

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
 Perfil  
 
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 18 Jul 2011, 08:49 
Membro Avançado

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
 Perfil  
 
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 18 Jul 2011, 14:25 
Membro Sênior

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
 Perfil  
 
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 18 Jul 2011, 14:39 
Membro Avançado

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
 Perfil  
 
 Assunto da Mensagem: Re: Referências (&) Ocupam Lugar na Memória???
MensagemEnviado: 18 Jul 2011, 15:01 
Membro Ativo

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
 Perfil  
 
Mostrar mensagens anteriores:  Ordenar por  
Criar um novo TópicoWrite comments Página 1 de 2   [ 16 posts ]
Ir para página 1, 2  Próximo
Similar topics
Alocação de memória no Turbo C++
Fórum: C/C++
Autor: gaMba
Respostas: 2
J2ME - Jogo da Memória em código aberto
Fórum: Mobile
Autor: hardrion
Respostas: 12
Irrlicht: vasamento de memória
Fórum: Irrlicht Engine
Autor: irado
Respostas: 5
registro de memoria - duvida
Fórum: Bancos de Dados
Autor: rockman
Respostas: 5
outra forma de alocação de memória [Dúvida]
Fórum: C/C++
Autor: Otta00
Respostas: 1
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

Pesquisar por:
Ir para:  

cron


Powered by phpBB ©

Virtual Object Informtica Ltda. Fone/Fax: (15)3231-6840