首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++成员函数(Getter)

C++成员函数(Getter)
EN

Stack Overflow用户
提问于 2022-02-17 01:24:04
回答 1查看 52关注 0票数 0

我见过人们定义这样的成员函数:

代码语言:javascript
复制
void getValue(int& v)
{
    v = m_value;
}

也是这样的:

代码语言:javascript
复制
int getValue()
{
    return m_value;
}

我想第一个能节省记忆吧?这是你唯一一次使用第一种get函数吗?第二个似乎要方便得多。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-17 01:48:29

我想我会为你准备好的

来源

代码语言:javascript
复制
#include <iostream>
struct Foof{
    int m_val;

   Foof(int v){
      m_val = v;
}

void woodle()
{
    if(m_val > 42)
       m_val++;
    else
       m_val--;
      
}
void Get1(int &v)
{
    v = m_val;
}

int Get2()
{
    return m_val;
}
};

int main(int c, char**v){
    int q;
    std::cin >> q;
    Foof f1(q);
    std::cin >> q;
    Foof f2(q);

    f1.woodle();
    f2.woodle();
    int k;
    f1.Get1(k);

    int j = f2.Get2();
    std::cout << k << j;
}

woodle函数和cin初始化的目的是让编译器考虑一点。

我有2个foofs,否则编译器在Get1之后调用Get1时会说“我知道这个问题的答案”

编译用-03 -努力优化。代码是(gcc)

代码语言:javascript
复制
 pushq %rbx
  movl $_ZSt3cin, %edi
  subq $16, %rsp
  leaq 12(%rsp), %rsi
  call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
  movl 12(%rsp), %ebx
  leaq 12(%rsp), %rsi
  movl $_ZSt3cin, %edi
  call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
  movl 12(%rsp), %eax
  movl $_ZSt4cout, %edi

  leal 1(%rbx), %edx
  cmpl $43, %ebx
  leal -1(%rbx), %esi
  cmovge %edx, %esi
  leal -1(%rax), %ebx
  leal 1(%rax), %edx
  cmpl $43, %eax
  cmovge %edx, %ebx

  call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
  movq %rax, %rdi
  movl %ebx, %esi
  call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
  addq $16, %rsp
  xorl %eax, %eax
  popq %rbx
  ret

我分离了对Get1或Get2的实际调用,您可以看到

  • 生成的代码是相同的
  • 编译器在优化方面非常积极,没有函数调用等

课程:编写代码以便于人类阅读,并让编译器完成繁重的任务。

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

https://stackoverflow.com/questions/71151350

复制
相关文章

相似问题

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