c++通过引用和指针传递参数
c++ passing arguments by reference and pointer
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++的习惯,应该是首选的风格;在你自己的代码中,你真的不应该看到太多的原始指针。
还要注意,按值传递和按引用传递在本质上是不同的,因为按引用传递允许被调用方修改实参。如果有的话,你应该比较f(bar)
和f(const bar &)
。
指针和引用在语法上是不同的,在运行时和代码生成时通常是相同的。至于旧的编译器…我知道Borland 3 c++ DOS编译器中的一个bug:它在寄存器中缓存了一个int值(通过引用传递),修改了它,并且没有改变内存中的原始值。当通过指针传递时,等效代码按预期工作。
然而,我不认为任何现代编译器可能会做这样奇怪的事情(Borland 5已经修复了这个问题)
至于代码风格(除了指针和智能指针的权衡),如果地址不能通过函数契约为NULL,我通常使用引用,否则使用指针。
函数foo可以修改情况2和3中的arg。在第一种情况下,编译器可以优化副本创建,因此很难比较cpu和内存的使用情况。
如果您认为在使用指针参数之前验证它们是一种好做法,那么,是的,指针引入了额外的开销,因为引用不需要这样的测试。
- 使用指向成员的指针将成员函数作为参数传递
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 修改函数中的指针(将另一个指针作为参数传递)
- Clang bug?使用指针作为模板参数
- MSVC将仅移动结构参数解释为指针
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 如何使用非类型模板参数传入指向数组的指针
- 将成员函数指针作为参数传递给模板方法
- 匹配函数指针作为模板参数?
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 通过智能指针和转换对基本模板参数进行模板推导
- 为函数定义符号不明确的指针参数
- 使用引用与指针将数组作为参数传递
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 将函数参数完美转发到函数指针:按值传递呢?
- 保留函数指针模板参数
- 如何构造一个以可变参数指针函数作为成员的类?
- 指向对象的非类型模板参数指针
- c++ 使用 *& as 参数(指针乐趣,三级树方法)