为什么这个自动矢量化器关心构造函数/析构函数
Why Does This Auto-Vectorizer Care About Constructors/Destructors?
这是一个SSCCE:
class Vec final {
public:
float data[4];
inline Vec(void) {}
inline ~Vec(void) {}
};
Vec operator*(float const& scalar, Vec const& vec) {
Vec result;
#if 1
for (int k=0;k<4;++k) result.data[k]=scalar*vec.data[k];
#else
float const*__restrict src = vec.data;
float *__restrict dst = result.data;
for (int k=0;k<4;++k) dst[k]=scalar*src[k];
#endif
return result;
}
int main(int /*argc*/, char* /*argv*/[]) {
Vec vec;
Vec scaledf = 2.0f * vec;
return 0;
}
编译时,MSVC 2013通知我(/Qvec-report:2
)
main.cpp(11): info C5002:循环未矢量化,原因为'1200'
这意味着"[l]oop包含循环携带的数据依赖"。
我注意到注释Vec
的构造函数或析构函数(edit:或默认它们,例如Vec()=default;
)会使其成功向量化。我的问题是:为什么?
注意:切换#if
也会使它工作。__restrict
很重要。
注意:将float const& scalar
更改为float const scalar
会导致向量化报告1303
(向量化不会成功),我怀疑是因为引用可以直接传递到SSE寄存器中,而值传递需要另一个副本。
为什么声明一个空的非虚析构函数inline ~Vec(void) {}
和一个空的默认构造函数inline Vec(void) {}
?
return result;
没有它就无法编译,因为这需要将结果复制到一个临时返回的对象中(这可能不是您想要的)。
要么定义复制构造函数,要么根本不定义空的构造函数和析构函数
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 编译器在不需要复制构造函数时关心复制构造函数
- 为什么这个自动矢量化器关心构造函数/析构函数