Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅在C+中使用堆栈的后果+; 让我知道一个对C++新手的人。他不传递指针(这是正确的),但他拒绝通过引用传递。他总是使用传递值。原因是,他认为“通过参照传递对象是一个破坏设计的标志”_C++_Pass By Reference_Pass By Name - Fatal编程技术网

仅在C+中使用堆栈的后果+; 让我知道一个对C++新手的人。他不传递指针(这是正确的),但他拒绝通过引用传递。他总是使用传递值。原因是,他认为“通过参照传递对象是一个破坏设计的标志”

仅在C+中使用堆栈的后果+; 让我知道一个对C++新手的人。他不传递指针(这是正确的),但他拒绝通过引用传递。他总是使用传递值。原因是,他认为“通过参照传递对象是一个破坏设计的标志”,c++,pass-by-reference,pass-by-name,C++,Pass By Reference,Pass By Name,该程序是一个小型的图形程序,大多数的传递都是数学向量(3元组)对象。有一些大型控制器对象,但没有比这更复杂的了 我发现很难找到反对只使用堆栈的致命论据 我认为,对于向量之类的小对象,传递值是可以接受的,但即使这样,代码中也会出现大量不必要的复制。按值传递大型对象显然是浪费,而且很可能不是功能上想要的 在专业方面,我相信堆栈在分配/释放内存方面更快,并且具有恒定的分配时间 我能想到的唯一主要论点是堆栈可能会溢出,但我猜这不太可能发生?还有其他反对只使用堆栈/传递值而不是通过引用传递的论点吗?我想说

该程序是一个小型的图形程序,大多数的传递都是数学向量(3元组)对象。有一些大型控制器对象,但没有比这更复杂的了

我发现很难找到反对只使用堆栈的致命论据

我认为,对于向量之类的小对象,传递值是可以接受的,但即使这样,代码中也会出现大量不必要的复制。按值传递大型对象显然是浪费,而且很可能不是功能上想要的

在专业方面,我相信堆栈在分配/释放内存方面更快,并且具有恒定的分配时间

我能想到的唯一主要论点是堆栈可能会溢出,但我猜这不太可能发生?还有其他反对只使用堆栈/传递值而不是通过引用传递的论点吗?

我想说,在C语言中不使用指针是一个新手程序员的标志

听起来你的朋友害怕指针

请记住,C++指针实际上是从C语言继承的,而C是在计算机功能不太强大的情况下发展起来的。然而,直到今天,速度和效率仍然至关重要

那么,为什么要使用指针呢?它们可以让开发人员优化程序,使其运行得更快,或者使用更少的内存,否则就不会如此!引用数据的内存位置比复制周围的所有数据要有效得多

指针通常是一个对于那些开始编程的人来说很难理解的概念,因为所做的所有实验都涉及到小数组,可能是一些结构,但基本上它们包括在家里有1GB内存的情况下使用几兆字节(如果幸运的话)。在这个场景中,几MB是微不足道的,它通常太小,不会对程序的性能产生重大影响

让我们稍微夸大一下。设想一个包含2147483648个元素(2GB数据)的字符数组,您需要将其传递给将所有数据写入磁盘的函数。现在,您认为哪种技术更高效/更快

  • 传递值,在程序将数据写入磁盘之前,必须将这些2GB的数据重新复制到内存中的另一个位置,或者
  • 通过引用传递,它将只引用该内存位置
如果没有4GB内存,会发生什么?你会仅仅因为害怕使用指针就花美元买内存芯片吗

在不需要的时候,在内存中重新复制数据听起来有点多余,这是对计算机资源的浪费

无论如何,对你的朋友要有耐心。如果他想在人生的某个阶段成为一名认真的/专业的程序员,他最终将不得不花时间真正理解指针


祝你好运。

如果不使用引用,就无法完成各种各样的事情——从复制构造函数开始。引用(或指针)是最基本的,不管他喜欢与否,他都在使用引用。(引用的一个优点,或者可能是缺点是,通常不必修改代码来传递(const)引用。)并且没有理由在大多数情况下不使用引用

是的,对于没有动态分配要求的小型对象来说,按值传递是可以的,但在没有具体测量的情况下说“无参考”是愚蠢的,因为所谓的开销是(a)可感知的,(b)重要的。“过早优化是万恶之源”1

一,
各种属性,包括(尽管他显然否认)。

正如前面提到的,引用和指针之间的最大区别是指针可以为空。如果类需要数据,则引用声明将使其成为必需。如果调用方需要,添加const将使其成为“只读”

所提到的传递值“缺陷”根本不是真的。按值传递所有内容将完全改变应用程序的性能。当原语类型(如int、double等)按值传递时,但当类实例按值传递时,则创建临时对象,这需要在类和类中的所有成员变量上调用构造函数和析构函数。当使用大型类层次结构时,这是令人恼火的,因为还必须调用父类构造函数/析构函数

此外,向量通过值传递并不意味着它只使用堆栈内存。heap可以用于每个元素,因为它是在传递给方法/函数的临时向量中创建的。如果向量本身达到其容量,它可能还必须通过堆重新分配


如果传递值被设置为不修改调用者的值,则只需使用常量引用。

子类型多态性是一种情况,在这种情况下传递值将不起作用,因为您会将派生类切片到其基类。也许对某些人来说,使用子类型多态性是糟糕的设计?

你朋友的问题不在于他的想法,而在于他的宗教信仰。给定任何函数,总是考虑通过值、引用、const引用、指针或智能指针的利弊。然后决定

我在这里看到的破坏设计的唯一迹象是你朋友的盲目宗教

也就是说,有一些签名并没有带来多少好处。按值获取常量可能很愚蠢,因为如果您承诺不更改对象,那么您也可能不更改
Object foo(Object d) { d.bar(); return d; }

int main(int argc, char* argv[])
{
  Object o;
  o = foo(o);
  return 0;
}