我见过人们定义这样的成员函数:
void getValue(int& v)
{
v = m_value;
}也是这样的:
int getValue()
{
return m_value;
}我想第一个能节省记忆吧?这是你唯一一次使用第一种get函数吗?第二个似乎要方便得多。
发布于 2022-02-17 01:48:29
我想我会为你准备好的
来源
#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)
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的实际调用,您可以看到
课程:编写代码以便于人类阅读,并让编译器完成繁重的任务。
https://stackoverflow.com/questions/71151350
复制相似问题