Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用常量引用字段替换简单方法(例如vector::size())是个好主意吗?_C++ - Fatal编程技术网

C++ 用常量引用字段替换简单方法(例如vector::size())是个好主意吗?

C++ 用常量引用字段替换简单方法(例如vector::size())是个好主意吗?,c++,C++,例如,这是我对vector的实现: template<typename T, /*...*/> class List { private: /*...*/ int count; int capacity; public: /*constexpr int Count() noexcept { return count; }*/ /*constexpr int Capacity() noexcept { r

例如,这是我对vector的实现:

template<typename T, /*...*/>
class List {
private:
    /*...*/
    int count;
    int capacity;

public:
    /*constexpr int Count() noexcept {
        return count;
    }*/
    /*constexpr int Capacity() noexcept {
        return capacity;
    }*/

    const int& Count = count;
    const int& Capacity = capacity;

    /*...*/
}
模板
班级名单{
私人:
/*...*/
整数计数;
国际能力;
公众:
/*constexpr int Count()无异常{
返回计数;
}*/
/*constexpr int Capacity()无异常{
返回能力;
}*/
常量int&Count=计数;
const int&Capacity=容量;
/*...*/
}
因为这两个方法只返回一个
private
字段,确保无法更改,并且函数中没有其他操作、检查或异常。在这种情况下,我能代替你吗

我注意到的一个缺点是由于两个引用(指针),为
List
添加了16个字节。它能被优化吗

在这种情况下,我能代替你吗

你可以

用常量引用字段替换简单方法(例如vector::size())是个好主意吗


不。这是在浪费内存。

向类中添加引用成员没有任何好处——您注释掉的公共方法更有效,因为编译器在优化它们时不会受到别名问题的约束。此外,使用参考成员也有几个缺点:

  • 它们会增加类对象的大小(如您所述)
  • 调用者可能会获取其中一个成员变量的地址并保留它(例如,
    const int*myPtr=&myList.Count
    ),然后在
    列表
    对象被销毁后尝试取消引用该指针,从而调用未定义的行为
  • 将引用添加为成员对象意味着C++编译器不会为您生成默认赋值运算符;如果需要,您必须手动定义一个

  • 简短的、内联定义的方法(如在发布的代码中注释掉的方法)几乎总是由编译器进行优化,这样调用它们时就不会涉及函数调用开销;因此,通过避免它们,您不会获得任何性能提升。

    这不是我通常会使用的技术(而且从来都不需要使用)。可能有一些特殊的情况让我考虑这种技术,但我无法想象它们会是什么。使用这些函数有什么不对吗?编译器肯定会对它们进行优化,您不需要存储引用。这不是一个好主意,正如前面提到的,这可能是一个去优化。一方面,编译器通常会内联调用这些小而琐碎的函数,另一方面,它会节省ref开销额外的内存。@jkb只是为了省略括号。。顺便说一下,C#实际上是在后台使用getter和setter作为属性,而不是使用引用。引用成员比简单地浪费内存更糟糕。自引用成员是。。。比我个人喜欢的更接近人间地狱。不特定于引用成员。调用者可能会对非引用成员执行相同的操作,这同样是错误的。3.是真的,但是在向量容器实现的示例中,赋值运算符可能无论如何都必须是用户定义的。Eerorika当然可以,但在这种情况下,调用方不能这样做,因为非引用成员是私有的。我同意#2不是特定于引用成员的。调用方可能会获取对象的地址并保留它(例如,
    List*myPtr=&myList
    ),然后在
    List
    对象被销毁后尝试取消引用该指针,从而调用未定义的行为。打电话的人搞砸了,不是全班。