性能优化相关

129 阅读1分钟

zerocopy:减少内存拷贝

if -> switch

CRTP)

“返回值优化

如何确保编译器执行 RVO?

1,被调用的函数应为返回值定义单个变量.
2,调用函数应将返回的值分配给新变量.

SomeBigObject obj = SomeBigObject::SomeBigObjectFactory(...);

注意, RVO无效场景:

如果调用函数重用现有变量来存储返回值,则编译器无法执行 RVO
如果被调用的函数使用多个不同变量作为返回值,编译器无法执行 RVO,但是如果被调用的函数使用一个变量并在多个位置返回它,则没关系:

// RVO will happen here:
SomeBigObject local;
if (...) {
  local.DoSomethingWith(...);
  return local;
} else {
  local.DoSomethingWith(...);
  return local;
}

例外

RVO 适用于临时对象,而不仅仅是命名变量。当被调用的函数返回临时对象时,您可以从 RVO 中受益

// RVO works here:
SomeBigObject SomeBigObject::ReturnsTempFactory(...) {
  return SomeBigObject::SomeBigObjectFactory(...);
}

当调用函数立即使用返回的值(存储在临时对象中)时,您还可以从 RVO 中受益:

// No message about expensive operations:
EXPECT_EQ(SomeBigObject::SomeBigObjectFactory(...).Name(), s);

严格别名-- strict-aliasing rules

在 C99 中,创建与原始类型不同的别名是非法的。这通常被称为严格别名规则。

cellperformance.beyond3d.com/articles/20…