在 c++ 中将指针转换为值需要付费吗?
Does it cost to convert pointer to value in c++?
我正在学习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 &
作为可供选择的替代重载时,从性能的角度来看,这些传递*this
和this
之间没有区别。
但是,您的代码还有其他混乱和问题。你在这里有几个不同维度的探视,我认为你对正交案例感到困惑。以下是我看到的情况:
- 您有一个访问者,该访问者在访问时将保持不变,并且正在访问的内容也不会更改。
- 您有一个访客,该访客将在访问时更改,并且正在访问的内容不会更改。
- 您有一个访问者,该访问者在访问时将保持不变,并且正在访问的内容将更改。 您有一个访问者,该
- 访问者将在访问时更改,并且正在访问的事物也将更改。
我认为你混淆了被访问的事物被改变的情况,以及访问者在访问事物时改变的情况。如果你不是,你会有四种不同的accept
方法,而不是两种,或者VisitorHostInterface
和VisitorInterface
中的接受方法将在不同的地方有其const
限定符。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错