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 中,创建与原始类型不同的别名是非法的。这通常被称为严格别名规则。