编译器会展开此循环吗?
|
我正在创建一个多维矢量(数学矢量),其中允许基本的数学运算+,-,/,*,=。模板有两个参数,一个是类型(int,float等),另一个是向量的大小。目前,我正在通过for循环应用操作。现在考虑到在编译时就知道大小,编译器会展开循环吗?如果没有,有没有办法在没有(或最小)性能损失的情况下展开它?
template <typename T, u32 size>
class Vector
{
public:
// Various functions for mathematical operations.
// The functions take in a Vector<T, size>.
// Example:
void add(const Vector<T, size>& vec)
{
for (u32 i = 0; i < size; ++i)
{
values[i] += vec[i];
}
}
private:
T values[size];
};
在有人评论“ 1”之前,请注意,这是我的3D图形引擎的基础,并且必须快速。其次,我想了解一下自己的知识。
没有找到相关结果
已邀请:
6 个回复
阀傻
现在编译
并查看disasm
如您所见,第一个循环足够小,可以展开。第二个是循环。
浆错
嘘崇蔡对
骇毖煽洁铂
然后是参考代码段“ 8”:
现在使用GCC编译它们,只吐出程序集:
根据我的经验,当使用在编译时知道持续时间的循环时,默认情况下,GCC将展开不超过3个循环。使用
会使它展开得更多。
锯康
的值,等等)。 如果您真的想知道,请询问您的编译器:将其编译为汇编代码,其典型值为
,并使用您实际使用的优化标志,然后检查结果。
窝头菊