首页 > 其他分享 >对象传参、返回与接收的优化

对象传参、返回与接收的优化

时间:2024-04-21 11:56:41浏览次数:26  
标签:传参 接收 int 对象 Foo 优化 eric 构造函数

C++的编译器会给一个空的类提供六个函数

  • 默认构造函数
  • 析构函数
  • 拷贝构造
  • 拷贝赋值
  • 移动构造
  • 移动赋值

在提供构造函数时,编译器将不再提供默认构造

这些函数在对象传参、返回对象、接收对象时会自动调用,所以有必要进行相应的优化,减少这种隐式调用
以下面这段代码为例:

#include <iostream>
class Foo {
public:
  Foo(int a) : _a(a) { std::cout << "Foo(int)" << std::endl; }
  ~Foo() { std::cout << "~Foo()" << std::endl; }
  Foo(const Foo &val) : _a(val._a) {
    std::cout << "Foo(const Foo&)" << std::endl;
  }
  Foo(Foo &&val) : _a(val._a) { std::cout << "Foo(Foo&&)" << std::endl; }
  Foo &operator=(const Foo &val) {
    if (this == &val)
      return *this;
    _a = val._a;
    return *this;
  }
  Foo &operator=(Foo &&val) {
    if (this == &val)
      return *this;
    _a = val._a;
    return *this;
  }
  int getA() const { return _a; }

private:
  int _a;
};

Foo bar(Foo f) {  // 3. Foo(const Foo&)
  int a = f.getA();
  Foo tmp(a);
  return tmp;
}

Foo bar2(const Foo &f) { return Foo{f.getA()}; }

int main() {
  {
    Foo f1(42);  // 1. Foo(int)
    Foo f2(10);  // 2. Foo(int)
    f2 = bar(f1);  // 4. Foo(int)
  }
  std::cout << "============================" << std::endl;
  {
    Foo f3(42);  // 1. Foo(int)
    Foo f4 = bar2(f3);  // 2. Foo(int)
  }
}

运行结果如下:

eric@eric-XPS-13-9360:~/tmp$ g++ main.cpp 
eric@eric-XPS-13-9360:~/tmp$ ./a.out 
Foo(int)
Foo(int)
Foo(const Foo&)
Foo(int)
~Foo()
~Foo()
~Foo()
~Foo()
============================
Foo(int)
Foo(int)
~Foo()
~Foo()

标签:传参,接收,int,对象,Foo,优化,eric,构造函数
From: https://www.cnblogs.com/ericling0529/p/18148749

相关文章

  • 在Linux中,如何优化虚拟机和容器的性能和资源使用?
    在Linux中优化虚拟机(VM)和容器的性能和资源使用涉及多个层面,以下是一些关键的优化策略:1.虚拟机性能优化:合理配置CPU资源:根据虚拟机的实际需求分配合适的vCPU数量,避免过度分配导致资源争抢。启用CPU亲和性设置,保证虚拟机在物理CPU核心上的稳定调度。使用NUMA(Non-UniformMe......
  • ASO布局策略,如何布局优化才能让产品快速成长?
    在面对黑色的8月,苹果爸爸闹脾气后,各种应用的下架、清词、清榜以及调整评论权重的一阵闹腾,可是把做ASO优化的小伙伴和开发小哥哥们,搞得鸡飞狗跳不得安宁。在面对慢慢把自己的主场进行的打扫干净的苹果爸爸,刚上架的app产品要怎样才能做好ASO优化呢?历经千辛万苦开发,准备上架的app怎......
  • vue3 优化ai生成的手写签名
    下面是baiduai生成的代码:在Vue3中实现手写签名功能,可以使用canvas元素来创建一个绘图区域,并监听鼠标事件来实现签名的记录。以下是一个简单的例子:vue<template><div><canvasref="signatureCanvas"@mousedown="startSigning"@mousemove="updat......
  • DM 传统行业SQL优化案例
    来OB这么久还没有接触啥金融的SQL,只能发点其他行业的数据库SQL优化案例。......
  • NTT 的三次变八次优化
    就是将NTT的域扩到复数。我不知道高斯整数的其他取模方式,所以巨慢/xk。而且没用。我们知道高斯整数的神秘取模方式,使得其结果的范数小于除数的一半。然而我们发现这个取模在整数下的结果仍然在整数取模的同余系中!好很有精神!我们选取\(g=3,mod=998244353\),我们只需要验证\(......
  • [ABC232G] Modulo Shortest Path (优化建图)
    链接:https://www.luogu.com.cn/problem/AT_abc232_g暴力的做法肯定不行,这道题要用到一个比较经典的拆点操作:把一个点拆成内点和外点。在接下来的分析中会慢慢介绍。由于题目每次连的边都是单向边,那要考虑的问题是:比如说现在要从1走到3,怎么走才能与暴力建边等价。先不考虑取模这......
  • 52条SQL语句性能优化策略,建议收藏
    52条SQL语句性能优化策略,建议收藏Bug哥不定时发布Java类技术文​关注 585人赞同了该文章本文会提到52条SQL语句性能优化策略。1、对查询进行优化,应尽量避免全表扫描,首先应考虑在WHERE及ORDERBY涉及的列上建立索引。2、应尽量避免在WHERE......
  • 构建镜像优化经验
    构建镜像已经简单到dockerbuild或buildkitbuild了,但优化镜像成了下一个问题。Layer层数据是叠加的容器镜像由多个Layer层数据组装而成,每一条命令结果都会以一个层存储并逐渐叠加。以Python镜像安装诸多包为例。#py-pip1.dockerfileFROMpython#安装每个包都以RUN命......
  • 一次性初始化/重新挂载/便捷类型/优化技巧
    React中一次性初始化在React中进行一次性初始化的两种推荐方案如下:方案1使用useState进行初始化:javascriptCopycodeconst[resource]=React.useState(()=>newResource());这种方法通过状态的惰性初始化来创建资源,代码直观且易于理解。方案2使用useRef保持实例不变......
  • NL2SQL技术方案系列(1):NL2API、NL2SQL技术路径选择;LLM选型与Prompt工程技巧,揭秘项目落
    NL2SQL技术方案系列(1):NL2API、NL2SQL技术路径选择;LLM选型与Prompt工程技巧,揭秘项目落地优化之道NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(SpidervsBIRD)全面对比优劣分析[Text2SQL、Text2DSL]NL2SQL基础系列(2):主流大模型与微调方法精选集,Text2SQL经典算法......