gpt4 book ai didi

c++ - 复制省略在默认函数参数中有效吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:28 27 4
gpt4 key购买 nike

考虑这段代码:

struct foo;
foo *p;

struct foo {
foo() { p = this; }
};

bool default_arg ( foo f = foo() )
{
return p == &f;
}

bool passed_in ( foo& f )
{
return p == &f;
}

int main()
{
std::cout << default_arg() << '\n';

foo f = foo();
std::cout << passed_in(f) << '\n';
}

我希望对于 default_argpassed_in 的调用,f 将只是默认构造,因为拷贝将被省略*。这将导致两个调用都返回 true。然而,Clang 3.7 nor GCC 5.3省略 default_arg 的默认参数中的拷贝。

复制省略在默认参数中有效吗?也许我遗漏了一些关于如何在每次调用时评估默认参数的明显信息。


编辑:重要的部分似乎是存在用户声明的复制构造函数。如果存在,则会发生复制省略。为什么这会有所作为?


*显然复制省略目前是可选的,但我希望 Clang 和 GCC 在可能的情况下这样做。

最佳答案

作为T.C.指出,在将可平凡复制的小类型传递给函数时,复制省略可能是不可能的。

这是因为某些 ABI(例如 System V ABI)的调用约定假定足够小的普通可复制类型将在寄存器中传递,而不是通过内存传递。例如,SysV 会将此类类型归类到 INTEGER 参数类中,而不是 MEMORY 类中。

这意味着如果您将这样的参数传递给需要获取参数地址的函数,则需要将寄存器内容复制到堆栈上,以便有一个有效地址。因此,无法执行从右值参数到按值参数的复制,即使语言规则可能表明它是可能的。

当然,在这种情况下,为了提高效率,复制省略是毫无用处的,但是对于那些好奇的人来说,在这样的平台上进行复制省略的一个简单方法是使类不可平凡复制。这方面的一个例子是使析构函数由用户提供:

struct foo {
foo() { p = this; }
~foo(){} //user-provided
};

这会导致在 Clang 3.7 和 GCC 5.3 上发生复制省略。

Live Demo

关于c++ - 复制省略在默认函数参数中有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35336882/

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