我有一个测试,我想对有关参数的两个问题做一些澄清。
在我的笔记中,它指出将参数传递给函数的推荐方法是使用“按引用传递”
const type& x; // for "in" parameters
type& x; // for "out"(to read) and "in/out"(to read/write) parameters
它还说明了可选的优化,我们可以按值传递“in”参数,我们也可以通过引用传递out变量而不是简单的返回。
在评论问题上,我试图回答它说明
假设所有类型都是“中等”大小:不要使用小值优化或大值优化。
对“中等大小”的引用是否意味着我会使用“in”和“in / out”参数的引用传递以及使用“out”值的基本返回值?
此外,还有一个问题要求创建具有以下内容的原型函数(无主体):
IN:字符串a,C b
OUT:双d
IN / OUT:字符串d
double foo (const string& a, const C& b, string& d)
是我现在所拥有的,但我不知道如何处理OUT和IN / OUT,因为它们具有相同的名称。我是否正确地假设对字符串的引用可以传递给函数,并且像stod()这样的函数用于生成double类型的返回,它可以存储在调用函数中,如
double val = foo(x,y,z)
答案 0 :(得分:1)
我不会进入不可变类型或任何其他低级语言语义,因为您仍然在学习传递价值的基础知识,因此我会尽可能直接地回答您的问题。留给你,让你的导师询问有关这些主题的更多信息(以及希望不要让你混淆测试)。
引用"中等大小"意思是我会在""中使用参考传递。和"进/出"参数以及使用" out"的基本回报;值?
根据您现在正在学习的内容,我会说否它所引用的大小是sizeof(X)
其中{{ 1}}是你传入/传出的类型。因此,在X
的实例中,执行值传递或传递引用对内存或CPU时间没有实际的额外成本,但如果我有类似以下内容:
int
如果我们按值传递(因为会发生复制),struct SomeLargeStruct {
char SomeChars[1000];
int SomeInts[1000];
double SomeDoubles[1000];
};
会相当大并且会产生很长的构建时间,例如:
sizeof(SomeLargeStruct)
所以" in"类型,你给void incurACopy(SomeLargeStruct s) { /* do something with s */ }
void giveMeDirect(SomeLargeStruct& s) { /* do something with s */ }
SomeLargeStruct c;
incurACopy(c); // a copy of c is made, lots of data being passed
giveMeDirect(c); // the location of c is passed on the stack, no copy made
声明代码的用户传入的值必须是有效的引用(即它不能为null),因为它const type&
合格,我们可以放心,参考我们类型的代码不会修改数据,也就是说,它是只读的。
" out" type为const
,因为这表示该函数可以修改中传递的值。如果type&
是一个大型(即type
)类型并且返回类型中涉及任何临时值,则执行此操作与返回可能成本较低,否则可能没有太大差异(您和#39; d必须检查低级装配。)
至于"进/出"类型,您可以再次使用sizeof
来表示值可以被修改,尽管我已经看过"进/出"类型更常被称为"可选"类型,即"输入/输出" type可以是一个可选参数,如果没有传入,则具有默认值,否则传入的值具有效果,因此可以进行修改。
" out" 可以修饰符和"进/出"类型是存在的,因为它会留给函数的实现者来记录值可能会改变的事实,换句话说,它们可能只是忘记将type&
放在{{1}之前1}}。
考虑到这一点,根据您对原型的其他问题,我谨慎地说const
和type&
是一个错字,否则,您总是可以写出2个函数原型:
OUT : double d
和/或
IN/OUT : string d
但为了安全起见,你应该仔细检查一下你的导师(毕竟,你可能不是唯一一个正在努力解决这个问题的人)。
希望能帮助你,并祝你的考试好运。