C++ 传递对要分配给C+中指针的函数的引用+;,哪条路更好?

C++ 传递对要分配给C+中指针的函数的引用+;,哪条路更好?,c++,C++,我想知道在这两种将地址传递给指针的实现中,哪一种更好。在第一个数据库中是否有第二个数据库中没有的数据交换?第二种方法更有效吗?更具可读性?都一样吗 第1版 void ptrFunction(int& arg) { int* ptr = &arg; std::cout<<"The pointer's value:" << *ptr << "\n"; } int main() { int x=5; ptrFunc

我想知道在这两种将地址传递给指针的实现中,哪一种更好。在第一个数据库中是否有第二个数据库中没有的数据交换?第二种方法更有效吗?更具可读性?都一样吗

第1版

void ptrFunction(int& arg)
{
    int* ptr = &arg;
    std::cout<<"The pointer's value:" << *ptr << "\n";
}

int main()
{
    int  x=5;
    ptrFunction(x);
    return 0;
}
void ptrFunction(int&arg)
{
int*ptr=&arg;

就效率而言,这两种方法几乎肯定会在幕后编译成相同的代码,因为引用通常被实现为自动取消引用的指针。从这个角度来看,这两种方法是等效的


至于是通过指针传递还是通过引用传递,这实际上是一个判断调用,取决于具体情况。如果您要做的只是打印一个指向整数的指针(就像您在这里所做的那样),则传递指针更有意义,因为它更明确地与您尝试执行的操作一致。通常,编写函数时,使参数的类型符合您内部需要的类型。如果您需要指针(因为您正在构建链接结构,或者因为您正在进行某种内存分配),请使用它指针。如果你处理的是多态类,那么传统上你会通过指针而不是引用来接受你的参数,尽管这两种方法都有效。如果你正在接受一个堆栈分配的对象来尝试修改它,那么引用可能会更清晰一些。而且,如果你处于必须使用引用-例如,作为重载运算符、复制构造函数或赋值运算符的参数-当然要使用引用。可读性现在确实被低估了,但努力获得干净、可读、直观的代码绝对值得。从性能角度看,这完全取决于实现当然可以。一般来说,它们会编译成相同的机器代码。这绝对是一种除非必须,否则根本不应该考虑优化的情况。可读性在大多数代码中更为重要

至于可读性,我倾向于选择版本2,因为我希望我的函数的用户知道我将(或能够)修改他放在其中的任何内容,但这条规则也有例外(例如捕获异常时,或运算符重载时)

应该是:

int *ptr = arg;

我发现引用参数比指针参数更具可读性,当不清楚该参数是否将在其他地方用作指针时。通常情况下,参数的使用通常是封装的,因此调用方不关心实现细节。但是,您可能必须遵守现有接口,这可能会导致e使用指针作为迭代器–然后您将“按值传递迭代器”(传递迭代器的常用方式),而不是“传递指向对象的指针”,即使该迭代器实际上是原始指针类型(也可以使用其他类型的现有接口)


除此之外,还有个人偏好和允许空指针的偏好(您不能有空引用),它们在各个方面都是相同的。

我认为这取决于函数的功能。现在你的函数名与它的功能不匹配。如果它匹配,它将被命名为
print\u pointer
,很明显它应该直接使用指针。(我读错了问题。但是的,它仍然取决于你的函数的功能。)

假设您有一个打印指针的函数,如:

void print_pointer(void* ptr)
{
    std::cout << ptr << std::endl;
}
void打印指针(void*ptr)
{

std::cout它们是等价的,这可以通过编译和检查反汇编来验证,反汇编除了符号名之外是相同的


至于风格,这主要是个人偏好,但有一种常见的模式,即使用指针表示out参数。这是因为当您获取引用时,不清楚您调用的函数是否会修改它。“有效的C++”对in参数使用常量引用,对out参数使用非常量指针。我发现这是一个很好的方法,可以明确合同是什么。

等等……这两个是等效的吗?@muntoo:No,版本1中的x=5,版本2中的x=100:)@Øystein哈哈。:)不管怎样,版本1应该打印5,但我不确定版本2。@muntoo:it哈哈这是一个拼写错误,正如Fred Nurk所提到的。是的,除了null之外,null作为引用无效。这是一个很少有用的属性,但至少有一种方式是它们不是100%相同。@Fred:我不喜欢一刀切的规则,有时我不得不牺牲可读性来提高性能。但是是的,可读性实际上总是如此胜利。我看到你最近给出了很多这样的答案。那些说“这两个几乎肯定会编译成相同的代码”的答案,停止尝试这种类型的微优化。他们都非常优秀,这一个也不例外。+1
int *ptr = arg;
void print_pointer(void* ptr)
{
    std::cout << ptr << std::endl;
}