• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

nDray

[dúvida] pointers e operação 'new'

5 mensagens neste tópico

Boa noite.... Eu andei para aqui a tentar criar uma stack de inteiros com lista-ligada, para ver se praticava um pouco o manuseamento de pointers, e porque neste momento estou a "estudar" as classes e tipos avançados.....

O meu problema está na função push.

01 struct node
02 {
03     int elem;
04     node* next_ptr;
05 };

01 inline void stack::push(int val)
02 {
03     assert(!isFull());
04
05     node* temp = new node;
06     temp->elem = val;
07     temp->next_ptr = top_ptr;
08     
09     top_ptr = temp;
10     
11     stack_size++;
12 }

Na verdade não há problema algum, mas porque é que, se eu substituir a linha 05 por "node* temp;" o programa funciona mal, com violações de acesso a memória, etc?

Além disso, antes não estava a conseguir porque o meu node temporário não era um pointer... Nunca ia resultar uma vez que o temp seria apagado no fim da função, certo....?

Já agora, e um pouco fora da temática.... Até que ponto é exagerado declarar uma função inline? (tendo em conta que só faz efeito com optimização -O3, e eu nem costumo fazê-lo, mas supondo que faria)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É evidente que tens de criar um elemento para que ele exista. Acho que acabaste por perceber isso, até porque acabaste por usar o new! Portanto não estou a perceber se a dúvida ainda existe!

Quanto ao inline... penso que não existe uma fronteira bem definida. Mas essa função parece-me um exagero ser inline.

Deves ter apenas em mente o que o inline implica, normalmente um push e um pop por cada inteiro que entre como parametro na stack do processo, e isto depende do metodo a usar "function call". Comvem saber o que implica usar inline para tentar perceber a fronteira. E isso resume-se a uma explicação de programação baixo nível

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então mas node* temp não cria já um pointer para um node? E o espaço não seria alocado quando tentasse definir valores para o pointer?

Quanto ao inline, no fundo estou a fazer bastantes operações, penso que será das poucas funções da classe onde não faz sentido o inline..... Tenho algum conhecimento do modo de funcionamento de baixo nível, não sei é até que ponto a máquina trata melhor um ou outro método...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

node* temp; cria o ponteiro, mas não aponta para nenhum node válido, a alocação de espaço dinâmicamente só é executada pelo new.

Digamos que o inline só merece ser considerado quando o número de intruções para carregar/descarregar os parametros da função na stack do processo é elevado em comparação ao número de instruções que são executadas na função. Ou seja tendo um elevado número de inteiros a entrar como parametros e tendo a função poucas instruções, eu considerava a possibilidade.

Depende também até que ponto se espera que essa função seja utilizada. Se a mesma for usada poucas vezes em um ciclo interno do programa em que a performance é necessária, eu considerava o inline.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

número de intruções para carregar/descarregar os parametros da função na stack do processo é elevado em comparação ao número de instruções que são executadas na função

Extremamente pertinente. Muito obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora