c++ - 在这种情况下哪个更有效:通过引用返回成员,还是作为指针返回?
问题描述
例如,我有一个使用 Eigen 库的类,如下所示:
class A
{
private:
Eigen::MatrixXd _matrix;
public:
Eigen::MatrixXd GetMatrix() const;
}
GetMatrix() 现在是这样实现的:
Eigen::MatrixXd A::GetMatrix() const
{
return _matrix;
}
假设在 main.cpp 中,我有一个执行以下操作的函数:
void PrintMatrix(const Eigen::MatrixXd &matrix)
{
std::cout<<"Print matrix: "<<matrix<<std::endl;
}
int main()
{
A obj;
PrintMatrix(obj.GetMatrix());
return 0;
}
在 GetMatrix() 函数中,我的目标是返回 _matrix 值,它将用于 main() 中。我想要最有效的方法。
我是优化新手,刚开始热身指针。正如你们所看到的,GetMatrix() 当前返回一个值,我知道按引用返回和按指针返回比按值返回要快得多,但是这样做的风险/利弊是什么?两者中哪一个更适合我的情况?
解决方案
在你的情况下,我会有一个带有签名的方法:
const Eigen::MatrixXd& GetMatrix() const noexecpt;
编译器将使用最合适的可用方法。在您的情况下,因为您的 print 函数将 const 引用作为参数,所以将自动使用引用版本。
现在我使用关键字 noexcept 作为公共方法。这告诉客户端不需要异常处理。有时编译器可以为此进行优化。
对于优化原型,我强烈推荐: https : //godbolt.org/ 那里还有 Quick-bench 和 CppInsights 工具的链接。
我只需要给你一个 Youtube 演讲的 const 参考:Jason Turner “Rich Code for Tiny Computers
推荐阅读
- json - 使用数据库中的 JSON 结果绑定 Select DropDown 时出错
- sparql - 从 s3 到 Neptune 的 Turtle 文件数据处理
- php - 我可以从命令行运行 curl 但不能从 shell exec 调用
- biztalk - 在 biztalk 中将每一行作为单独的消息处理?
- python - 加权元素的笛卡尔积
- java - Vaadin 10 (Flow) 的面板组件
- javascript - 使用 JavaScript 访问服务器端文件系统
- c - Ubuntu给我错误的输出
- javascript - 选择页面上的 Cookie 作为主页以供将来访问
- docker - 无法在容器内运行 mysql,该容器使用 dockerFile 构建映像