如果数组很大,使用指针作为c++类成员是更有效的方法吗?
Is using pointer as c++ class member a more efficient way if the array is large?
这里有几个关于指针的问题。
class object
{
private:
vector<point> points_;
}
假设我正在写一个如上所述的类,如果我有很多点,一个长数组,你会建议什么?我应该使用vector<point> points_
还是vector<point>* points_
?
使用指针对c++代码更有效,所以我应该尽可能地使用它?注意:我需要最后的程序越快越好。
经验丰富的程序员总是喜欢使用指针吗?如果效率不是问题,或者不是我关心的问题,我发现不使用指针对我来说更清晰,我发现使用指针总是有很多生命周期问题。由于
这里没有理由使用指针。无论vector对象中有多少个元素,其大小都是相同的(小的)。
vector已经包含一个指向存储数据的空间的指针。该空间是动态分配的(从自由存储区分配,假设您没有采取步骤更改它)。
Vector为动态数组。它的sizeof是常数,与它的大小无关。没有必要使用指针
问题实际上是选择正确的STL容器而不是指向容器的指针。摘自Effective STL
书
vector、list和deque为程序员提供了不同的复杂性权衡利弊,应该相应地使用,向量是类型的默认情况下应该使用序列,列表时应该使用中间有频繁的插入和删除序列、deque是大多数插入时选择的数据结构删节发生在开头或结尾序列。
Does an experienced programmer always love to use pointers?
智能指针非常方便,在实践中我们大多使用智能指针来代替new/delete
对原始指针的操作
当速度很重要时,为了帮助解决未来的问题,从缓存丢失的角度来考虑内存管理,而不仅仅是查找时间。以上答案我同意,不需要指针,除非你的类比一个页面文件大。在这种情况下,您可能需要考虑将类分解50或100次,但仍然不使用指针。
当考虑到速度时,例如在游戏引擎中,你需要将尽可能多的内存放在一起,并确保在需要之前加载它,并在不需要时卸载它。您希望避免内存碎片化,避免在缓存惩罚上遭受更多的命中。当我们试图保持一个特定的帧率时,比如30 fps,你真的不希望这个变化太大(这会发生在大量缓存丢失或内存移动的情况下)。使用std::vector,你可以像别人建议的那样做,提前分配,尝试分配足够的,或者比你需要的多一点,调整大小是痛苦的,在游戏运行期间,这可能是一个巨大的禁忌。
无论如何,有时候拥有一个大的对象数组/向量会更有效,即使你必须遍历它们才能找到你需要的对象,如果这意味着不会导致缓存丢失。如果内存是加载的,那么在顺序存储时从对象跳到对象是相当快的。此外,对于具有(int) id的事物,例如,执行vectorObject.at(id_location)的时间是恒定的,如果没有缓存问题,则速度非常快。
另一方面,有时最好加载std::map,例如包含指向非常大的向量的指针,这可能会导致大量缓存丢失(如数据库大小)。与遍历一个向量(n)的时间相比,遍历一个map的时间是lg(n),然后通过指针跳转到记录位置的效率更高,即使这是一个缓存丢失。它比遍历整个硬盘,产生令人流泪的缓存要好。这当然是一个永恒的问题,决定什么是正确的取决于你需要什么。知道如何避免缓存丢失可以帮助您做出更好的决策,因为您可以确定这不是最后一次需要考虑这个问题。
- 通过指针调用模板类成员函数 [为什么这是有效的 c++]?
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- 有效地初始化 const std::vector 类成员
- 在C 中实现基于模板的可选类成员的最有效方法
- 如何有效地将浮点数别名为数组的命名成员和元素
- 相对于向量对象的两个成员,找到两个向量的相交的有效方法
- 使用大型数据集初始化类成员向量的最有效方法
- 类模板的成员函数有条件无效(隐式实例化有效;显式实例化失败)
- 为什么仅在返回通用类中的自定义类型时才有效constexpr成员函数
- 模板化类的模板化成员编译失败.VC++ 有效,但 G++ 失败
- 具有未初始化成员的结构的constexpr默认构造函数仅在模板化时有效
- 使用相同的参数名称和成员名称是否有效
- 类模板成员模板的成员模板的显式模板函数专用化有效吗
- 将没有成员的函子设置为类成员对象还是堆栈对象更有效
- 智能感知说错误:成员"Class::field"无法访问,但它仍然有效?为什么?
- 为类中有效的成员变量提供初始值
- 在派生类构造函数中复制继承的成员有效吗
- 返回+重置成员变量的最有效方法
- 在C++03中,在未赋值的上下文中使用表示非静态数据成员的id表达式有效吗
- 使用数组作为元组成员:有效的C++11元组声明