c++通过引用和指针传递参数

c++ passing arguments by reference and pointer

本文关键字:参数 指针 引用 c++      更新时间:2023-10-16

in c++

class bar
{
    int i;
    char b;
    float d;
};
void foo ( bar arg );
void foo ( bar &arg );
void foo ( bar *arg );

这是一个示例类/结构和函数
我有一些问题

  • 在"asm",大小,速度中传递参数的第一种和第二种方式的区别是什么?
  • 在每种情况下,参数如何传递给函数foo(在指针的情况下,我知道指针被压在堆栈上)
  • 在传递参数时,在效率(速度,大小,首选性)方面哪个更好?
  • 什么是英特尔'asm'语法,对应于传递参数的每一种方式?

我知道大多数人说"这在现代编译器和cpu上并不重要",但如果我们谈论的是旧的cpu或编译器呢?

thanks in advance

指针方法和引用方法应该具有相当的可比性(在速度、内存使用和生成的代码方面)。

直接传递类强制编译器复制内存并将bar对象的副本放在堆栈上。更糟糕的是,在c++中,有各种讨厌的比特(默认复制构造函数和诸如此类的东西)与此相关。

在C中,我总是使用(可能是const)指针。在c++中,你应该使用引用

以任何合理的方式传递引用都可能导致涉及对象地址的代码。然而,主要的问题是使用引用更符合c++的习惯,应该是首选的风格;在你自己的代码中,你真的不应该看到太多的原始指针。

还要注意,按值传递和按引用传递在本质上是不同的,因为按引用传递允许被调用方修改实参。如果有的话,你应该比较f(bar)f(const bar &)

指针和引用在语法上是不同的,在运行时和代码生成时通常是相同的。至于旧的编译器…我知道Borland 3 c++ DOS编译器中的一个bug:它在寄存器中缓存了一个int值(通过引用传递),修改了它,并且没有改变内存中的原始值。当通过指针传递时,等效代码按预期工作。

然而,我不认为任何现代编译器可能会做这样奇怪的事情(Borland 5已经修复了这个问题)

至于代码风格(除了指针和智能指针的权衡),如果地址不能通过函数契约为NULL,我通常使用引用,否则使用指针。

函数foo可以修改情况2和3中的arg。在第一种情况下,编译器可以优化副本创建,因此很难比较cpu和内存的使用情况。

如果您认为在使用指针参数之前验证它们是一种好做法,那么,是的,指针引入了额外的开销,因为引用不需要这样的测试。