假设一个类用于从某个位置读取数据并以不同的格式(而不是线程安全)提供它。对于它读取的每个项目,它都是这样的:
TargetDataStruct HostToTargetConverter::Next()
{
HostDataStruct source;
sourceData->GetItem(m_index++, &source);
TargetDataStruct target;
target.seize = source.day;
target.have = source.fun;
return target;
}
在编译器的速度或可优化性方面,将HostDataStruct source
和TargetDataStruct target
声明为成员变量会有什么不同吗?我的想法是每次调用都不需要在堆栈上推送这两个结构,并且不需要每次都进行初始化。
答案 0 :(得分:1)
在您的代码中HostDataStruct& TargetDataStruct位于堆栈中,因此对读/写的访问速度最快。
优化删除所有不必要的操作
现在,如果将源和目标作为成员,那么唯一可以使代码更快的是,如果对象构造函数需要多次(通常在构造函数中调用“new”),并且经常调用代码。 / p>
为了便于阅读,您可以创建一个这样的转换构造函数:
TargetDataStruct(const HostDataStruct& value);
所以你的代码将是
TargetDataStruct HostToTargetConverter::Next()
{
HostDataStruct source;
sourceData->GetItem(m_index++, &source);
return TargetDataStruct(source);
}
但是如果你的sourceData容器/对象保持数据存活,你也可以避免HostDataStruct分配,使你的sourceData-> GetItem()返回一个const HostDataStruct&amp ;;
const HostDataStruct& GetItem(const int p_id);
您的代码将是这样的:
TargetDataStruct HostToTargetConverter::Next()
{
return TargetDataStruct(sourceData->GetItem(m_index++, &source));
}
最后一个解决方案应该是最快的,避免无用的副本和对象构建。
如果您仍需要性能,即:如果您经常调用代码,请执行以下操作: 在第一次调用时,在缓存中构建TargetDataStruct,然后始终返回对缓存数据的引用。
答案 1 :(得分:1)
一般来说,不可能给出比“依赖”更好的答案。
将HostDataStruct
和TargetDataStruct
纳入成员所带来的差异包括:
source
和target
的包含类的功能
分别评估this->source
和this->target
(即
解除引用this
)。要确定哪个选项提供更好的运行时间速度,您需要进行测试 - 例如使用分析器。您获得的结果可能特定于您的编译器,主机配置等等。