C++ 声明对指针的pointed by值的引用的开销

C++ 声明对指针的pointed by值的引用的开销,c++,pointers,reference,C++,Pointers,Reference,假设我有一个函数,它接受一个指向参数的指针 void foo(Info* bar) { } 如果我不需要在任何时候解除对条形图的引用,而是在函数代码的开头执行此操作: Info& i_val = *Info; 我这样做是否会引入任何特殊类型的(明显的)开销?或者,这就好像我只是去引用指针一样 请注意,我不会接受任何问题,这是一个坏主意(没有适当的理由),抱怨在C++代码库中使用原始指针。 另外请注意,我不能更改函数的签名 我这样做是否会引入任何特殊类型的(明显的)开销 不。引用处理

假设我有一个函数,它接受一个指向参数的指针

void foo(Info* bar) {

}
如果我不需要在任何时候解除对条形图的引用,而是在函数代码的开头执行此操作:

Info& i_val = *Info;
我这样做是否会引入任何特殊类型的(明显的)开销?或者,这就好像我只是去引用指针一样

请注意,我不会接受任何问题,这是一个坏主意(没有适当的理由),抱怨在C++代码库中使用原始指针。
另外请注意,我不能更改函数的签名

我这样做是否会引入任何特殊类型的(明显的)开销

不。引用处理非常有效,因此除了在自动区域中存储引用本身之外,您不需要使用任何其他资源

或者,这就好像我只是去引用指针一样


创建引用和取消引用原始指针之间的最大区别在于重新分配指针时会发生什么。引用将继续引用在创建
i_val
bar
指向的对象,而直接取消引用
bar
将给出其当前位置。

您能否解释为什么传递指针而不是引用开始?您试图解决的实际问题是什么?“请注意,我无法更改函数的签名”。这是因为我现在无法更改公共API,但我希望代码更清晰(避免到处都是*s和->s)。当启用编译器优化时,它通常可以执行您希望的引用操作。总的来说,我在那个级别上经历了编译器做得最好的优化。不要担心,让优化。引用只是C++中的语法构造,在运行时,它们只是普通指针。因此,您只是将一个指针替换为另一个指针。有意创建别名并不是一个好主意,您会让优化器更难理解取消对别名指针的引用不会产生无意的副作用。但是现代的编译器在这方面做得相当好,只要您在只使用i_val和从不使用bar方面保持一致,那么代码运行速度就不太可能变慢。你必须确定你的个人资料。如果bar是nullptr,一定要注意UB。指针在函数的生命周期内不会改变它的值,所以第二个警告不会成为问题(尽管值得注意)。为了更好地表达这一点,指针应该在函数签名处声明为const,可惜我现在不能更改它。