为什么向量不支持 size 作为成员变量,就像 Java 类中的长度变量一样,而是函数 size()?

Why doesnt vector support size as member variable like length variable in a Java class, instead a function size()?

本文关键字:变量 size 一样 函数 不支持 向量 成员 就像 为什么 Java      更新时间:2023-10-16

为什么std::vector或其他容器没有length作为成员变量,而不是函数?使用函数读取向量的大小比成员变量的成本更高。

vector<int> v;
....
for (int i = 0; i < v.size(); i++) {
....
}

在上面的示例中,它应该始终调用size()函数,并且需要更多的 CPU 周期。我认为Java库在这方面使用的方法比在设计中使用STL C++更优化的方法。

我知道它有一个私有成员函数,库设计者可能希望限制从类外部访问。

任何评论/想法?

为什么 std::vector 或其他容器没有长度作为成员变量,而不是函数?

因为如果它是公共成员变量,它将是可写的。 由于写入向量的大小成员是没有意义的,因此设计人员将大小成员设为私有,并提供了一种size()方法来读取其值。 Java 数组的length成员声明为final,因此您无法更改它。 您可以在C++中使用长度const的成员做同样的事情,但是std::vector需要能够更改其length,所以这也没有意义。 这与java的ArrayList类使用size()方法而不是公共成员的原因相同(这样它就可以通过List接口提供动态调度(。

使用函数读取向量的大小比成员变量的成本更高。

其实不然。 该方法的定义在调用时可用,因此调用几乎肯定会由任何像样的编译器内联。 最后,编译器最终将为公共成员变量或访问器方法生成完全相同的机器代码。

为什么 std::vector 或其他容器没有长度作为成员 变量,而不是函数?

因为如果长度是成员,它有两个缺点: (i( sizeof(vector( 会因为这个成员而更大。 (ii( 任何操作都不是改变向量:clear((、insert((、erase((、push_back((、pop_back((、emplace_back(( swap(( 都必须调整这个成员,这将使这些操作变慢。

它也不一定慢,因为如果 size(( 作为返回成员数据的包装函数实现,这将由一个好的编译器内联。

就目前而言,vector 通常实现为 3 个指针:指向内存块开头的指针、指向最后一个有效元素之外的指针和刚好超出内存块末尾的指针。 size(( 是最后一个有效元素和内存块开始之间的差值(就元素数量而言(。它类似于ptrdiff_t。

成员函数使供应商可以自由地以他们认为最好的方式实施,确保它们符合 ISO C++ 标准。