请求的对齐方式为16的形式参数将不会对齐

时间:2019-05-02 20:39:25

标签: c++ visual-c++ alignment

考虑一个简单的类,以读取/写入某种属性。该类使用模板化的成员函数,该函数从调用中推断出属性的类型。在这种情况下,调用将尝试检索“ matrix4”类型元素作为命名属性。这是相关的代码部分:

    class ConfigManager
    {
       ...

       template<typename T>
       T GetConfigurationProperty(uint32 id, const std::string& property, T defaultVal = T())
       {
           // code
       }
    };

当使用MSVC编译为Windows 64位目标时,并且在32位计算机上的Ubuntu Linux gcc 8上,该代码也可以正常工作。但是,使用MSVC将其编译为32位目标(在64位计算机上)时,出现编译问题。

这是我得到的错误:

  

错误C2719:'defaultVal':请求的对齐方式为16的形式参数无法对齐(编译源文件config.cpp)

     

config.cpp(45):注意:请参见对正在编译的函数模板实例化'T ConfigManager :: GetConfigurationProperty(uint32&,const std :: string&,T)'的引用

     with
     [
         T=matrix4
     ]

隐含的“ defaultVal”为矩阵4。这是根据glm结构定义的

struct matrix4 : public glm::mat4{};

为清楚起见,我省略了构造函数和方法,但是没有添加任何额外的成员,没有虚拟方法或构造函数,因此结构的编译字节大小应完全相同。 glm :: mat4仅存储16个浮点数或一半的浮点数。

我已经在Matrix4定义的前面使用了__declspec(align(16)定义),但这似乎并没有改变任何东西,因为我将类型基于第三者结构的事实可能会导致任何declspec另外,由于不填充第3个参数时应设置默认值,因此该参数不能由ref传递。

由于默认的参数说明符,Formal parameter with __declspec(align('16')) won't be aligned的答案不适用于此处。它不能由ref传递。可能在vs2013中起作用的hacky解决方案在vs2017中不起作用,也就是说,添加了强制数据副本。当函数调用类型,参数类型(matrix4)放入堆栈时,副本已经存在问题。

有人有什么主意吗?

0 个答案:

没有答案