在 c++ 中将指针转换为值需要付费吗?

Does it cost to convert pointer to value in c++?

本文关键字:c++ 指针 转换      更新时间:2023-10-16

我正在学习c++。 我学会了何时应该在谷歌风格指南中使用"通过指针传递"或"通过常量引用传递"。 它说

(1) 如果函数中的任何成员发生变化,则应通过指针传递该值。

(2) 如果函数中的任何成员没有更改,则应通过 const 引用传递该值。

我想知道当我有一个实例的指针并且任何成员都不会在新函数中更改时,我是否需要使用常量引用传递函数来保留谷歌风格指南。如果是这样,我需要通过"*指针"将指针转换为实际值。我关心从指针到实际价值的转换成本,但老实说,我不知道它是否有成本。请告诉我在这种情况下该怎么做。

当我使用访客模式时,就会发生这种情况。我需要使用"this"指针,但函数中的成员不会改变。我不知道在这种情况下保留谷歌风格指南是否有任何好处或成本。

以防万一,我复制下面的示例代码。这是访客模式的一部分。它有两个函数,分别通过指针传递和通过常量引用传递。

#include <iostream>
class ClassA;
class VisitorInterface {
public:
virtual ~VisitorInterface() = default;
virtual void operator() (ClassA* obj) const = 0;
virtual void operator() (const ClassA& obj) const = 0;
};
class VisitorsHostInterface {  // = visitor's host
public:
virtual ~VisitorsHostInterface() = default;
virtual void accept(VisitorInterface* v) = 0;
virtual void accept(const VisitorInterface& v) = 0;
};
class VisitorsHost : public VisitorsHostInterface {
public:
virtual ~VisitorsHost();
void accept(VisitorInterface* v) override {};
void accept(const VisitorInterface& v) override {};
};
class ClassA : public VisitorsHostInterface {
public:
void print() const { std::cout << "ClassA value_ = " << value_ << std::endl; }
void accept(VisitorInterface* v) override {
(*v)(this);
};
void accept(const VisitorInterface& v) override {
v(*this);
};
private:
int value_=11;
};
class Visitor : public VisitorInterface {
public:
virtual ~Visitor() = default;
void operator() (ClassA* obj) const override {
if (obj) {
obj->print();
}
}
void operator() (const ClassA& obj) const override {
obj.print();
}
};

在您的情况下,没有

您有两个签名

void accept(VisitorInterface* v) override {};
void accept(const VisitorInterface& v) override {};

它们都需要一个引用(或者指针和引用,如果你想精确的话),所以你实际上并没有把它转换为一个对象,在这两种情况下,你只会将this的地址传递给每个接受函数

但是,如果您有

void accept(const VisitorInterface v) override {};

你可以调用一个复制构造函数,这可能很昂贵,这取决于它的作用。

首先,对于您要问的问题,当您将Thing *const Thing &作为可供选择的替代重载时,从性能的角度来看,这些传递*thisthis之间没有区别。

但是,您的代码还有其他混乱和问题。你在这里有几个不同维度的探视,我认为你对正交案例感到困惑。以下是我看到的情况:

  1. 您有一个访问者,该访问者在访问时将保持不变,并且正在访问的内容也不会更改。
  2. 您有一个访客,该访客将在访问时更改,并且正在访问的内容不会更改。
  3. 您有一个访问者,该访问者在访问时将保持不变,并且正在访问的内容将更改。
  4. 您有一个访问者,该
  5. 访问者将在访问时更改,并且正在访问的事物也将更改。

我认为你混淆了被访问的事物被改变的情况,以及访问者在访问事物时改变的情况。如果你不是,你会有四种不同的accept方法,而不是两种,或者VisitorHostInterfaceVisitorInterface中的接受方法将在不同的地方有其const限定符。