2017-01-21 13 views
0

Этот код:Странное поведение с getIntegerv() и Std :: соиЬ

#include <iostream> 

#define GLEW_STATIC 
#include <GL/glew.h> 
#include <GLFW/glfw3.h> 

int main(void) 
{ 
    GLint version; 
    glGetIntegerv(GL_MAJOR_VERSION, &version); 
    std::cout << version << std::endl; 
    //(Un)comment the next line 
    //std::cout << "" << version << std::endl; 
    glfwTerminate(); 
    return 0; 
} 

выходы:

32766 

или

0 
0 

, когда линия комментируется или раскомментирована, соответственно, ,
Я знаю, что перед использованием некоторых методов вы должны инициализировать glfw и glew библиотеки (с инициализацией glfw это все еще происходит), но ... Как возможно, что предыдущая строка меняет свое поведение, комментируя или раскомментируя следующую строку? Машина идет в прошлое и выполняет предыдущую строку? omg

PS: Я знаю, что такое «неопределенное поведение», но это не значит, что вы можете нарушать законы физики, путешествовать в прошлое и изменять поведение некоторых методов.

+0

Повторите за мной: неопределенное поведение - * undefined *! –

ответ

1

Я знаю, что перед использованием некоторых методов вы должны инициализировать библиотеки glew, но ... Как возможно, что предыдущая строка меняет свое поведение на комментирование или раскомментирование следующей строки?

Потому что это то, что «не определено» в непредсказуемое поведение средства.

Когда вы вызываете функцию GL без текущего контекста GL, все может случиться. Таким образом, у вас есть неопределенное поведение со стороны GL. Тем не менее, в реальном мире большинство реализаций просто сделают ничего в этом случае, поэтому version не получает письменного разрешения, и вы печатаете содержимое неинициализированной переменной , поэтому у вас есть неопределенное поведение на стороне C++, тогда , В реальном мире вы, скорее всего, печатаете некоторое содержимое своего стека, и, изменяя код, вы меняете скомпилированный результат.

+0

Я знаю, что такое «неопределенное поведение». Но мой вопрос: как возможно, что неопределенное поведение нарушает законы физики и вызывает разрыв пространства-времени, заставляя предыдущую строку изменить свое поведение? –

+1

Это не нарушает законов физики. Я уже написал это. Когда вы компилируете другую программу, вы не можете предположить, что остальная часть кода остается прежней. Переменная может закончиться в другом месте в стеке, или стек может иметь разные значения. Если вы действительно хотите посмотреть, что происходит, вам придется посмотреть на дизассемблированный код для обоих вариантов, а не только на исходный код. И это как раз неопределенное поведение. В реальном мире он не «неопределен», он не определен на одном уровне, но все еще определен ниже. – derhass

+1

Поскольку неизвестная, но все же случайная квантовая природа пространства-времени, добавленная известной Неопределенностью Гейзенберга, заставляет ОС предоставлять различный адрес памяти для glGetIntegerv каждый раз, когда его просят в разных исполнениях. – Ripi2

 Смежные вопросы

  • Нет связанных вопросов^_^