首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用寄存器按值返回基本类型的实现是否会执行“临时物化”?

使用寄存器按值返回基本类型的实现是否会执行“临时物化”?
EN

Stack Overflow用户
提问于 2022-09-06 00:36:58
回答 2查看 142关注 0票数 2

(c++20;工作草案N4868)

返回/2声明返回语句通过复制初始化初始化glvalue结果或prvalue结果对象

返回语句通过从操作数复制初始化(9.4)来初始化(显式或隐式)函数调用的glvalue结果或prvalue结果对象。

对于类类型,返回语句“调用”选定的构造函数并复制初始化变量obj (调用的结果对象),因为复制省略(实现是传递dest地址的调用者,因此被调用的函数通过构造函数调用初始化dest )。

代码语言:javascript
复制
class MyClass {
  int x;
};

MyClass func() {
  return MyClass(); //initializes the result object of the function call
}

int main() {
  MyClass obj {func()}; //obj is the result object of func().
}

dcl.init.general/16.6.1建议:

如果初始化器表达式是prvalue,且源类型的cv非限定版本与目标类相同,则初始化器表达式用于初始化目标对象。

对于int、double等基本类型,常见的实现是将操作数(返回表达式)复制到寄存器的返回语句。

(gcc 12.1 -std=c++20)

代码语言:javascript
复制
int func() {
  return 2;
}

int main() {
  int myInt {func()}; 
}
代码语言:javascript
复制
func():
        push    rbp
        mov     rbp, rsp
        mov     eax, 2
        pop     rbp
        ret
main:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        call    func()
        mov     DWORD PTR [rbp-4], eax
        mov     eax, 0
        leave
        ret

class.temporary/1.2,中,标准说,如果类型是“微不足道的可复制的”,是否有可能实现临时文档:

创建了1个临时对象 ..。 -(1.2)当执行程序需要传递或返回一个微不足道的可复制类型的物体时(见下文), ..。

问题

  • 实现是否类似于基本类型(int、double等)?使用类.临时/1.2作为源?
  • 如果是,那么函数调用是否物化了一个临时的(使用寄存器),并且返回语句通过复制初始化初始化临时语句?

相关

按值返回的函数的返回语句中的初始化

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-06 07:55:06

使用寄存器按值返回基本类型的实现是否会执行“临时物化”?

是。

实现是否类似于基本类型(int、double等)?使用类.临时/1.2作为源?

临时/(1.2)是对[class.temporary]/3的非规范性引用,实现不能用于非类类型,这是CWG2434的主题。

  1. 强制复制省略与非类对象 在下面的示例中, int f() { x;返回4;} int a= f(); a必须在f()的返回语句中直接初始化,因为允许临时函数参数和class.temporary第3段中的返回类型的异常只适用于某些类类型。 这个要求是可以观察到的,因为示例中的X析构函数可以检查a的值。 本段中的权限也应适用于所有非类类型。
票数 1
EN

Stack Overflow用户

发布于 2022-09-06 03:32:36

该标准描述的是行为,而不是实现。换句话说,CPU寄存器不是一个对象;在任何寄存器中存在任何值,在任何意义上都不是语言或程序(因为基本类型没有可能检测到它们的特殊成员函数)所能识别的副本。

类似地,使用调试器运行的程序的视图不需要对应于程序访问的任何状态。该实现使用寄存器之类的东西来提供语言的语义,但它不需要标准中的权限来以任何特定的方式来实现。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73615686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档