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