【发布时间】:2011-09-02 18:13:20
【问题描述】:
我正在创建一个多维向量(数学向量),其中允许基本的数学运算 +、-、/、*、=。模板有两个参数,一个是类型(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];
};
在有人遇到Profile then optimize 之前,请注意这是我的 3D 图形引擎的基础,它必须很快。其次,为了自学,我想知道。
【问题讨论】:
-
听起来不是很刻薄,但是如果您使用优化进行编译并转储程序集,您几乎可以找到:)
-
即使它必须非常快,分析也是一个非常宝贵的工具。事实上,如果必须非常快,它是你的节日朋友尤其是,因为它比猜测要好得多。 (此外,答案可能在很大程度上取决于编译器、使用的标志,甚至更多。)
-
@larsman:如果您在 3-D 模型中有超过 40 亿个点,那么与使用 32 位计数相比,您遇到的问题更大。 (除此之外,GPU 驱动程序可能已经硬编码了 32 位计数。)
-
这确实闻起来像是过早的优化。首先让您的图形引擎工作。然后分析和优化。我猜这段代码不会成为你的瓶颈。
-
@Ben Voigt 从不。 Dijkstra 不是说过称职的程序员“因此他以完全谦逊的态度处理他的任务,并避免像瘟疫一样的正确性”?... ;)
标签: c++ visual-studio-2008 compiler-optimization