Qual é a diferença entre esses dois e por que um é mais eficiente que o outro em termos de uso de memória?

Como outros comentadores apontaram,

glfwCreateWindow

retorna um ponteiro, para que o segundo código não funcione.

  1. GLFWwindow * glfwCreateWindow (largura int, altura int, const char * title, monitor GLFWmonitor *, compartilhamento GLFWwindow *)

Então, vamos assumir uma pergunta mais geral: por que o ponteiro geralmente é mais eficaz em termos de memória que a instância?

Vamos pensar um pouco na alocação de memória.

Em C e C ++, variáveis, definidas no corpo da função, são alocadas na pilha (ou nos registradores, se a alocação da pilha puder ser otimizada). A pilha é um bloco de memória pré-alocado e seu tamanho é limitado; portanto, a alocação de grandes estruturas nela pode levar ao erro "estouro de pilha".

Agora, comparando a alocação de um ponteiro, que, por definição, não é maior que um registro e uma estrutura que poderia ter tamanho arbitrário, o ponteiro seria menor na grande maioria dos casos e, portanto, usaria menos precioso na pilha memória.

Então, há uma consideração de copiar. Se você possui uma função que retorna um ponteiro e desrefere o ponteiro e o atribui a uma variável alocada na pilha ou na pilha, copia efetivamente os dados de um local de memória para outro. Para piorar as coisas, se você não liberar explicitamente a memória, que foi alocada por função, que retorna o ponteiro, essa memória nunca será liberada e você terá um vazamento de memória.

Para piorar ainda mais, as variáveis ​​alocadas à pilha têm a chamada duração automática do escopo, o que significa que essas serão desalocadas (e posteriormente substituídas) quando você sair da função onde elas estão alocadas. Isso significa que você provavelmente trabalhará com um ponteiro para desalocar a memória, o que é uma ótima maneira de explodir seu programa.

Agora, se você alocar memória no heap (com novo ou malloc), precisará se preocupar apenas com vazamentos e cópias de memória. Mas você precisará usar um ponteiro para fazer referência à memória alocada ao heap, portanto, não há diferença real no aplicativo para o exemplo 1.

Então, para encurtar a história: o segundo exemplo não é apenas "menos eficaz em termos de memória", está completamente errado, por mais que você olhe para ele.