__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