操作堆上变量的效率问题?

srhouyu 2016-04-22 10:43:38
如果需要操作大量的同类型小对象,例如struct Point{float x,y;},打算把它们放在vector中或者数组中。
一种选择是,这些小对象都是new出来的,那么就是std::vector<Point*>或者Point*数组
一种选择是,这些小对象都是值,那么就是std::vector<Point>或者Point数组

以上两种选择,当操作这些小对象时,效率有差别吗?只考虑访问元素的效率。

我的纠结在这里:

1. std::vector<Point>中的元素都直接是值,它们的实际数据在内存中应该是一个连续的数组。那么,依次访问这些连续数据,会不会在缓存命中方面具有优势?

2. std::vector<Point*>的Point是在不同时间new出来的,它们的实际数据可能是会在堆中乱七八糟分布的。那么,当我访问这些元素的时候,是否会比第一种方法慢一些呢?

在实际中,我应该采用哪种方式,可以让访问效率更高?

请有经验的老司机解惑。
...全文
146 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
srhouyu 2016-04-25
  • 打赏
  • 举报
回复
感谢老司机们
encoderlee 2016-04-24
  • 打赏
  • 举报
回复
一个相当于
int array[100];
array[0] = 10;
array[1] = 20;
array[2] = 30;
.....
一个相当于
int *array[100];
array[0] = new int(10)
array[1] = new int(20);
array[2] = new int(30);
.....
.....
delete array[0];
delete array[1];
delete array[2];
.....

无论是开发效率还是运行效率,你觉得哪个好?
另外无论vector<int>还是vector<int*>(假设大小为100)
其内部的int array[100];和int *array[100];都在堆上
当获取一个元素的值时,前者通过指针+偏移量就读到了值
后者通过指针+偏移量,读到了一个指针,然后再根据这个指针去读值
小灸舞 2016-04-23
  • 打赏
  • 举报
回复
如果不需要多态的话还是建议object 只需要一次就可以access到对象。 如果你使用pointer,同样dereference会导致cache miss。 但是那都是理论,先release profile吧
paschen 版主 2016-04-23
  • 打赏
  • 举报
回复
第二种主要慢在多一步解引那个指针
renwotao2009 2016-04-23
  • 打赏
  • 举报
回复
第一种好,楼上说的很好,连续内存是缓存命中高,速度快,第二种使用指针本身就二次访问内存,速度慢。vector存储小对象管理和访问都很方便
yshuise 2016-04-23
  • 打赏
  • 举报
回复
对于大对象,比如是文件之类的,当然用指针更好些
jiuniangyuanzikk 2016-04-23
  • 打赏
  • 举报
回复
vector自身的内存就是采用内存池的,相对命中要比扩塞在整个内存中的地址来的快,至于指针和对象的获取效率方面,对现在的硬件来说无所谓吧
赵4老师 2016-04-23
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
dustpg 2016-04-22
  • 打赏
  • 举报
回复
肯定是std::vector<Point>效率高啊,在x64上, floatx2 是8字节,指针也是8字节。 也就是说在x64上回消耗至少两倍的内存, 而且多了一层(间接寻址), 效率简直了, 内存又多花了,效率又低,又不好维护,慢慢的缺点,找不到一个优点. std::vector<Point>缓存命中又是一个一个天大的优势.

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧