C++这是一种微优化形式

Mar*_*uss 2 c++ micro-optimization

这是微优化,还是优化呢?

void Renderer::SetCamera(FLOAT x, FLOAT y, FLOAT z) {
    // Checking for zero before doing addition?
    if (x != 0) camX += x;
    if (y != 0) camY += y;
    if (z != 0) camZ += z;

    // Checking if any of the three variables are not zero, and performing the code below.
    if (x != 0 | y != 0 | z != 0) {
        D3DXMatrixTranslation(&w, camX, camY, camZ);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用带有vector.size()的条件运行for循环会强制应用程序重新计算每个循环中向量中的元素吗?

std::vector<UINT> vect;

INT vectorSize = vect.size();
for (INT Index = 0; Index < vectorSize; Index++) {
// Do vector processing
}

// versus:

std::vector<UINT> vect;

for (INT Index = 0; Index < vect.size(); Index++) {
// Do vector processing
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Visual Studio,至于第二个问题,它似乎是编译器可以优化的东西,但我只是不确定.

Sha*_*baz 5

根据向量的实现,编译器可能会或可能不会理解大小未更改.毕竟,你在循环中调用不同的向量函数,其中任何一个都可能改变大小.

由于vector是一个模板,然后编译器知道它的一切,所以如果它真的很难,它可以理解大小不会改变,但这可能太多了.

通常,你会想这样写:

for (size_t i = 0, size = vect.size(); i < size; ++i)
    ...
Run Code Online (Sandbox Code Playgroud)

虽然我们正在使用它,但迭代器使用了类似的方法:

for (list<int>::iterator i = lst.begin(), end = lst.end(); i != end; ++i)
    ...
Run Code Online (Sandbox Code Playgroud)

编辑:我错过了第一部分:

这是优化吗?

if (x != 0) camX += x;
if (y != 0) camY += y;
if (z != 0) camZ += z;
Run Code Online (Sandbox Code Playgroud)

首先,即使它们是int,也不是优化,因为检查和分支时值大概是大多数时间不是零是更多的工作.

其次,更重要的是,它们是浮动的.这意味着除了你不应该直接将它们与0比较的事实,它们基本上几乎不会完全等于0.所以ifs是99.9999%真.

同样的事情适用于此:

if (x != 0 | y != 0 | z != 0)
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,由于矩阵转换成本很高,您可以:

#define EPS 1e-6 /* epsilon */
if (x > EPS || x < -EPS || y > EPS || y < -EPS || z > EPS || z < -EPS)
Run Code Online (Sandbox Code Playgroud)

现在是的,与矩阵乘法相比,这可能是一种优化.

还要注意我使用的||是短路,如果例如从开头x > EPS就是真的(它不会计算其余部分),但是|不会发生这种情况.