为什么向量不支持 size 作为成员变量,就像 Java 类中的长度变量一样,而是函数 size()?
Why doesnt vector support size as member variable like length variable in a Java class, instead a function size()?
为什么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++ 标准。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 为什么向量不支持 size 作为成员变量,就像 Java 类中的长度变量一样,而是函数 size()?
- 在C++中定义包含TTF_Font变量的向量时"Undefined size"错误
- 可以将vector.size()的结果存储到int类型的变量中吗
- 如何比较cocos2dx中的float和Size变量内容
- 使用 .size() 与 const 变量进行循环