gpt4 book ai didi

c++ - 在不使用其值的情况下调用非 void 函数时是否制作拷贝?

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:39 25 4
gpt4 key购买 nike

This question并不能完全帮助我澄清这个问题。假设我有这个功能:

int foo(){
/* some code */
return 4;
}

int main(){
foo();
}

由于我按值返回,是否会复制 foo() 返回的整数? This answer提到编译器会将函数变成void函数。这是否意味着实际调用的函数将是这个函数?

void foo(){
/* some code */
}

这个问题是关于同时使用类方法作为辅助函数和接口(interface)函数的。例如,假设定义了类 MatrixVector

class Force
{
public:
Matrix calculate_matrix(Vector & input);
Vector calculate_vector(Vector & input);
private:
Matrix _matrix;
Vector _vector;
};

实现

Matrix Force::calculate_matrix(Vector & input){
/* Perform calculations using input and writing to _matrix */
return _matrix;
}
Vector Force::calculate_vector(Vector & input){
calculate_matrix(input)
/* Perform calculations using input and _matrix and writing to _vector */
return _vector;
}

每当我在 Force::calculate_vector() 中调用 Force::calculate_matrix() 时,我是否正在复制 _matrix?每当我只需要知道 _matrix 的值时,我就需要 Force::calculate_matrix() 作为接口(interface)。会有一个辅助函数,例如:

void Force::_calculate_matrix(Vector & input){
/* Perform calculations using input and writing to _matrix */
}

然后在 Force::calculate_matrix()Force::calculate_vector() 中使用它是一个更好的设计解决方案,或者我可以摆脱提到的编译器优化上面是为了避免 Force::calculate_matrix() 返回值的拷贝?

最佳答案

要回答这个问题,有必要重新审视一下从函数事物中“返回”的整个过程。一旦你开始深入研究它,它真的很有趣。

首先,int的例子和后一个问题确实无关。请继续关注以了解原因:)

首先要记住的是,在程序集级别没有“返回值”。相反,指导如何从函数返回值的规则在所谓的 ABI 协议(protocol)中定义。不久前,有许多不同的 ABI 协议(protocol)在运行,但现在,感谢某人,我们看到的大部分是所谓的 AMD64 ABI。特别是,根据它,返回一个整数意味着将一个值插入 RAX 注册表。

因此当您忽略整数返回值时,您的代码将不会读取 RAX。

返回一个对象就不一样了。事实上,对象是在调用函数准备好的地方返回的(这个地方的位置被传递给被调用者)。 Callee 执行所有初始化并用值填充对象。调用代码而不是适本地处理“空格”。

现在,被调用函数不知道结果是否会被使用(除非它是内联的)。所以它总是必须“返回”一个值——将 int 放入 RAX 或在提供的空间中初始化对象。即使该值未被使用,在调用方站点代码仍然需要分配空间——因为它知道被调用函数会将数据放入其中。由于调用代码知道该空间不会被使用,它将被丢弃并且不会在调用站点制作任何拷贝。 callee中还是会有一份的!

现在,更有趣了。输入编译器优化。根据您的 caluclate_matrix 函数的大小,编译器可能决定将其内联。如果发生这种情况,所有“参数传递”都将消失——没有任何东西可以传递,因为代码将在调用站点简单地执行,就好像根本没有函数被调用一样。发生这种情况时,将永远不会有拷贝,并且整个 return 语句可能会被优化掉——没有地方可以返回它。

我希望,这确实回答了这个问题。

关于c++ - 在不使用其值的情况下调用非 void 函数时是否制作拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33833791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com