__declspec(align('16')) 的形式参数不会对齐
Formal parameter with __declspec(align('16')) won't be aligned
我正在尝试创建用于设置着色器制服的函数,但是当我尝试编译它时出现此错误:
Error 2 error C2719: 'value': formal parameter with
__declspec(align('16')) won't be aligned
函数代码如下:
void Shader::setUniform(std::string name, const glm::mat4 value){
GLint uniform = glGetUniformLocation(m_program, name.c_str());
glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat*)&value);
}
我正在使用 Visual studio 2013.
来自 Microsoft's documentation 关于那个错误:
The align __declspec modifier is not permitted on function parameters.
不要将参数复制到未对齐的位置。传递对现有的、已经对齐的数据的常量引用。
void Shader::setUniform(const std::string &name, const glm::mat4 & value)
// ^^^^^ ^
我不确定 glm::mat4 的实现,但它的设置方式无法将其中的数据放在内存中的完整 'word' 位置,或者它是在创建时创建的在未对齐的位置(你从文件中读取?在某处做一些指针算术技巧?)
http://virtrev.blogspot.com/2010/09/memory-alignment-theory-and-c-examples.html
如果您想破解 'get it working',您可以尝试:
void Shader::setUniform(std::string name, const glm::mat4 value){
// This assumes your copy constructor works correctly
glm::mat4 alignedMat = value;
GLint uniform = glGetUniformLocation(m_program, name.c_str());
glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat*)&value);
}
我以前用过这个技巧来强制对齐数据。您还可以对 alignedMat 执行 memcpy 以强制有时对齐。不要认为这是正确的方法。您应该创建具有正确对齐方式的元素。仅供查看未对齐、测试和调试。
此外,如果您在方法定义中的参数上使用 __declspec 修饰符。不要。
通过引用传递您的参数(这里是一个名为 "color" 的 3D 矢量),以消除对齐错误:
void SetColor(btVector3 color) { m_color = color; } // does give the error
void SetColor(btVector3 &color) { m_color = color; } // does not
我正在尝试创建用于设置着色器制服的函数,但是当我尝试编译它时出现此错误:
Error 2 error C2719: 'value': formal parameter with __declspec(align('16')) won't be aligned
函数代码如下:
void Shader::setUniform(std::string name, const glm::mat4 value){
GLint uniform = glGetUniformLocation(m_program, name.c_str());
glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat*)&value);
}
我正在使用 Visual studio 2013.
来自 Microsoft's documentation 关于那个错误:
The align __declspec modifier is not permitted on function parameters.
不要将参数复制到未对齐的位置。传递对现有的、已经对齐的数据的常量引用。
void Shader::setUniform(const std::string &name, const glm::mat4 & value)
// ^^^^^ ^
我不确定 glm::mat4 的实现,但它的设置方式无法将其中的数据放在内存中的完整 'word' 位置,或者它是在创建时创建的在未对齐的位置(你从文件中读取?在某处做一些指针算术技巧?)
http://virtrev.blogspot.com/2010/09/memory-alignment-theory-and-c-examples.html
如果您想破解 'get it working',您可以尝试:
void Shader::setUniform(std::string name, const glm::mat4 value){
// This assumes your copy constructor works correctly
glm::mat4 alignedMat = value;
GLint uniform = glGetUniformLocation(m_program, name.c_str());
glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat*)&value);
}
我以前用过这个技巧来强制对齐数据。您还可以对 alignedMat 执行 memcpy 以强制有时对齐。不要认为这是正确的方法。您应该创建具有正确对齐方式的元素。仅供查看未对齐、测试和调试。
此外,如果您在方法定义中的参数上使用 __declspec 修饰符。不要。
通过引用传递您的参数(这里是一个名为 "color" 的 3D 矢量),以消除对齐错误:
void SetColor(btVector3 color) { m_color = color; } // does give the error
void SetColor(btVector3 &color) { m_color = color; } // does not