为什么std::vector
或其他容器没有length
作为成员变量而不是函数?使用函数读取向量的大小比成员变量的开销更大。
vector<int> v;
....
for (int i = 0; i < v.size(); i++) {
....
}
在上面的示例中,它应始终调用size()
函数,并且需要更多的CPU周期。我认为Java库在设计中比C ++ STL使用了更优化的方法。
我了解它具有私有成员功能,并且库设计人员可能希望限制从类外部进行访问。
有任何评论/想法吗?
答案 0 :(得分:2)
为什么std :: vector或其他容器没有长度作为成员变量而不是函数?
因为如果它是一个公共成员变量,它将是可写的。由于没有必要写入向量的size成员,因此设计人员将size成员设为私有,并提供了一种$ dotnet project restore
$ dotnet project build
方法来读取其值。 Java数组的size()
成员被声明为length
,因此您不能更改它。您可以使用长度为final
的成员在C ++中执行相同的操作,但是const
必须能够更改其std::vector
,所以这也没有意义。这与java的length
类使用ArrayList
方法而不是公共成员的原因相同(这样,它就可以通过size()
接口提供动态调度)。
使用函数读取向量的大小比成员变量的开销更大。
实际上不是。该方法的定义在调用时可用,因此几乎可以肯定,任何体面的编译器都可以内联该调用。最后,编译器最终将为公共成员变量或访问器方法生成完全相同的机器代码。
答案 1 :(得分:0)
为什么std :: vector或其他容器的长度不为成员 变量而不是函数?
由于length是成员,因此有2个缺点: (i)sizeof(vector)会因为这个成员而变大。 (ii)除更改向量外的任何操作:clear(),insert(),erase(),push_back(),pop_back(),emplace_back()swap()都必须调整此成员,这会使这些操作变慢。 / p>
也不一定较慢,因为如果将size()实现为返回成员数据的包装器函数,那么好的编译器将内联。
就目前而言,向量通常实现为3个指针:指向存储块起始位置的指针,仅指向最后一个有效元素之外的指针和仅指向存储块结尾之外的指针。然后,size()是最后一个有效元素与内存块开始之间的差(就元素的数量而言)。它类似于ptrdiff_t。
成员函数可让供应商自由地以最佳状态实施,以确保它们符合ISO C ++标准。