方法链接慢 C++ 吗?
Is method chaining slow C++?
例如,以下哪个更快:
if(object.GetMemberX().IsSomething())
{
Store(object.GetMemberX());
object.GetMemberX().FlagSomething();
}
或
typeX x = object.GetMemberX();
if(typeX.IsSomething())
{
Store(x);
x.FlagSomething();
}
我想如果 GetMemberX()
return 是指针或引用,那么在第一个示例中,编译器无法优化这两个调用,因为它无法保证 returned pointer/reference 每次调用都相同吗?
但是在第二个例子中我存储了它?
如果这是真的,它是否仅适用于 return 和 pointer/reference 的方法?如果我的方法 return 按价值计算,它们会因不同的调用而受益/受到阻碍吗?
第二个版本更具可读性。但是,它可能会调用 typeX
的复制构造函数。要快速读取 和 ,请使用引用或指针:
typeX& x = object.GetMemberX();
if(typeX.IsSomething())
{
Store(x);
x.FlagSomething();
}
唯一不应该使用引用的情况是按值 object.GetMemberX()
returns 时,在这种情况下,您的第二个版本是可行的。在这种情况下,存储 return 值不会产生开销,因为编译器可以优化复制(复制省略)。
这个问题无法在 C++ 一般上下文中回答...因为它取决于编译器实现和优化级别!
您甚至不能确定处于特定优化级别的特定编译器不会为两个版本生成完全相同的代码,因为最终操作应该是相同的。
我的建议是只使用通用规则:首先编写可读的代码(由你和如果可能的同行......)。当出现性能问题时,分析程序并仅优化应有的小部分,始终通过对不同可能性进行基准测试。
当然,以上内容主要涉及低级优化,如您在此处提出的问题。您应该始终选择与预期用途一致的算法 ...
例如,以下哪个更快:
if(object.GetMemberX().IsSomething())
{
Store(object.GetMemberX());
object.GetMemberX().FlagSomething();
}
或
typeX x = object.GetMemberX();
if(typeX.IsSomething())
{
Store(x);
x.FlagSomething();
}
我想如果 GetMemberX()
return 是指针或引用,那么在第一个示例中,编译器无法优化这两个调用,因为它无法保证 returned pointer/reference 每次调用都相同吗?
但是在第二个例子中我存储了它?
如果这是真的,它是否仅适用于 return 和 pointer/reference 的方法?如果我的方法 return 按价值计算,它们会因不同的调用而受益/受到阻碍吗?
第二个版本更具可读性。但是,它可能会调用 typeX
的复制构造函数。要快速读取 和 ,请使用引用或指针:
typeX& x = object.GetMemberX();
if(typeX.IsSomething())
{
Store(x);
x.FlagSomething();
}
唯一不应该使用引用的情况是按值 object.GetMemberX()
returns 时,在这种情况下,您的第二个版本是可行的。在这种情况下,存储 return 值不会产生开销,因为编译器可以优化复制(复制省略)。
这个问题无法在 C++ 一般上下文中回答...因为它取决于编译器实现和优化级别!
您甚至不能确定处于特定优化级别的特定编译器不会为两个版本生成完全相同的代码,因为最终操作应该是相同的。
我的建议是只使用通用规则:首先编写可读的代码(由你和如果可能的同行......)。当出现性能问题时,分析程序并仅优化应有的小部分,始终通过对不同可能性进行基准测试。
当然,以上内容主要涉及低级优化,如您在此处提出的问题。您应该始终选择与预期用途一致的算法 ...