C++ 为什么glm::mat3和glm::value_ptr会在时间和宇宙中创造一个黑洞,并破坏我头脑中任何可能的逻辑?
我用所有著名的OpenGL框架创建了一个漂亮的图形引擎,但突然出现了一个意想不到的问题(就像所有问题一样) 我必须创建一个函数来修改glm::mat3中的特定值。为此,我创建了一个简单的函数,该函数返回对glm::mat3中特定浮点的简单引用,但由于不知道是什么原因,似乎什么都不起作用 以下是我的功能:C++ 为什么glm::mat3和glm::value_ptr会在时间和宇宙中创造一个黑洞,并破坏我头脑中任何可能的逻辑?,c++,glm-math,C++,Glm Math,我用所有著名的OpenGL框架创建了一个漂亮的图形引擎,但突然出现了一个意想不到的问题(就像所有问题一样) 我必须创建一个函数来修改glm::mat3中的特定值。为此,我创建了一个简单的函数,该函数返回对glm::mat3中特定浮点的简单引用,但由于不知道是什么原因,似乎什么都不起作用 以下是我的功能: float& mat3ValueAt(glm::mat3& m, int l, int c) { // l is the line index and c is the
float& mat3ValueAt(glm::mat3& m, int l, int c) {
// l is the line index and c is the column index...
return glm::value_ptr(m)[3 * l + c];
}
为了查看它是否有效,我必须使用一个能够显示矩阵的函数:
std::ostream& operator<<(std::ostream& stream, glm::mat3 m) {
for (int i = 0; i < 9; i++) {
stream << GLS::mat3ValueAt(m, i / 3, i % 3) << ((i + 1) % 3 ? ' ' : '\n');
}
return stream;
}
所以我前面的两个函数不起作用的事实是可以的,也许我只是不知道value_ptr是如何工作的。。。但我很确定一件事。。。
一个值不能有我们分配给它之前要分配的值 我输入的值而不是42并不重要,它总是在我分配它之前被分配 这怎么可能呢?这: 创建未初始化的对象;此对象的内容具有不确定的值。任何试图读取具有不确定值的对象的值的尝试都会导致未定义的行为 因此,编译器可以自由地对代码重新排序,使其如下所示:
int main() {
glm::mat3 m;
*(glm::value_ptr(m) + 5) = 42;
std::cout << "display uninitialised value..." << std::endl;
std::cout << *(glm::value_ptr(m) + 5) << std::endl; // should display an uninitialised value
std::cout << "display the initialised value" << std::endl;
std::cout << *(glm::value_ptr(m) + 5) << std::endl; // should display 42
}
intmain(){
glm::mat3 m;
*(glm::value_ptr(m)+5)=42;
std::cout“一个值不能有我们分配给它之前要分配的值!”->未初始化的变量可以有任何值,包括42。编译器甚至可能优化*(glm::value_ptr(m)+5)=42;
在初始化时正确执行此操作。但更可能的是,在对程序的构造性调用中,您的函数堆栈在内存中的同一位置创建,因此值42被重用。为了跟进@R2RT的注释,在我的机器上,我可以使用int m[4]
执行相同的操作,并打印m[2]的值
在赋值前后m[2]=42
。使用-O3
编译会输出42次。未经优化的编译会输出0然后输出42。(这是osx上的叮当声)。
display uninitialised value...
42
display the initialised value
42
glm::mat3 m;
int main() {
glm::mat3 m;
*(glm::value_ptr(m) + 5) = 42;
std::cout << "display uninitialised value..." << std::endl;
std::cout << *(glm::value_ptr(m) + 5) << std::endl; // should display an uninitialised value
std::cout << "display the initialised value" << std::endl;
std::cout << *(glm::value_ptr(m) + 5) << std::endl; // should display 42
}