C++ 写入by value函数参数的方式好吗?

C++ 写入by value函数参数的方式好吗?,c++,C++,我经常听到这样一条规则:更改按值给定给函数的参数是糟糕的编码方式。相反,最好创建一个经过修改的副本 但我认为在以下情况下,可以接受更改函数参数。你认为最好的方法是什么 Point3f GetWorldPoint(int x, int y) { x = saturate(x, 0, width); y = saturate(y, 0, height); ... } template<typename T> T saturate(T val, T min, T

我经常听到这样一条规则:更改按值给定给函数的参数是糟糕的编码方式。相反,最好创建一个经过修改的副本

但我认为在以下情况下,可以接受更改函数参数。你认为最好的方法是什么

Point3f GetWorldPoint(int x, int y)
{
    x = saturate(x, 0, width);
    y = saturate(y, 0, height);

    ...
}

template<typename T>
T saturate(T val, T min, T max) {
    return std::min(std::max(val, min), max);
}
Point3f GetWorldPoint(int x,int y)
{
x=饱和(x,0,宽度);
y=饱和(y,0,高度);
...
}
模板
T饱和(T值、T最小值、T最大值){
返回标准::min(标准::max(val,min),max);
}

我要把我的脖子伸到这里,说没事。例如:

template<class T>
Matrix4x4<T> Transpose(Matrix4x4<T> m)
{
    return m.Transpose();
}
模板
Matrix4转置(Matrix4 m)
{
返回m.转置();
}

模板
Matrix4x4转置(Matrix4x4常量和m)
{
矩阵x4x4n(m);
返回n.转置();
}

哪个更简洁?

我对使用

Point3f GetWorldPoint(int x, int y)
{
    x = saturate(x, 0, width);
    y = saturate(y, 0, height);

    ...
}
因为即使在语义上,x和y在saturate函数前后也是不一样的(毕竟它们是饱和的)。在更复杂的情况下,这可能会令人困惑。当然,在明显的函数中,在饱和之后,现在使用饱和x仍然很简单

不管怎么说,这没有什么问题

Point3f GetWorldPoint(int origX, int origY)
{
    int x = saturate(origX, 0, width);
    int y = saturate(origY, 0, height);

    ...
}

这更清楚,优化编译器会在这两种情况下创建类似的代码。

我相信编译器会对其进行优化,所以这都是个人偏好。我认为最好的方法是我的意见。这主要是基于观点。虽然按值返回显然比修改引用要好。同意@AngeloGeels编译器可以进行优化,因此这是个人的选择,但一般来说,如果您不需要它,您应该避免复制。与问题完全无关,您调用saturate的函数通常称为clamp。“我总是听到这样一条规则:更改按值给定给函数的参数是糟糕的编码方式“我的观点是:这是一种不错的编码风格。非常好。该参数是您自己的本地副本。你可以随心所欲地使用它。在这个具体的例子中,我有点受不了。如果我没有弄错的话,这两种代码之间确实有区别。由于RVO不能应用于函数参数,第一个参数将导致转置->移动/复制,而第二个参数将导致复制->转置。这可能对矩阵没有影响,但要记住。我认为,不管怎样,只要你要复制一个矩阵,就可以通过值传递它。我记得读过或看到斯科特·梅耶斯(Scott Meyers)谈论这件事,尽管我的记忆很模糊。
Point3f GetWorldPoint(int origX, int origY)
{
    int x = saturate(origX, 0, width);
    int y = saturate(origY, 0, height);

    ...
}