社区
C++ 语言 帖子详情 请教:用vector是不是要比指针慢很多 kissjhy 2012-11-15 04:26:10 对简单的数组操作 用vector是不是要比指针慢很多,
...全文
827 21 打赏 收藏 请教:用vector是不是要比指针慢很多 对简单的数组操作 用vector是不是要比指针慢很多, 复制链接
扫一扫 分享 转发到动态 举报 AI 作业
写回复 配置赞助广告取 消
确 定
用AI写文章 21 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 tag180 2012-11-16 打赏举报 回复 不知道楼主的很多是多多。。。。个人经验是基本差不多,,前提是不要瞎用 gohay1 2012-11-16 打赏举报 回复 用vector就是省心,不会有内存泄漏问题。
用数组效率最高,但一不小心就会忘记释放内存。
如果代码块不复杂的话,用用vector也无妨,但这个vector不要用上瘾,不管三七二十一就用vector superzxn0705 2012-11-16 打赏举报 回复 http://bbs.csdn.net/topics/390249739#r_79933325
可以参考我之前的这个。
数组和vector有重叠,不过两者都有存在的意义 唯恐天下不乱 2012-11-16 打赏举报 回复 自己测试一下就知道慢不慢了。
获得系统时间。如:windows的GetTickCount()
同一个操作for循环100W次,或者更高。
再获取系统时间。
看差值
cbzjzsb123 2012-11-16 打赏举报 回复 qin_zhu 2012-11-16 打赏举报 回复 引用 楼主 kissjhy 的回复:对简单的数组操作 用vector是不是要比指针慢很多,
那要看你是什么操作,如果是简单的取值,可能指针快一些;要是排序等复杂操作,那当然vector快了。 stereoMatching 2012-11-16 打赏举报 回复 目前比较可能造成明显差距的应用方式
我只知道一种,就是用vector大量且频繁的分配记忆体
如果你遇上这种情况,一个是重写allocator
一个是改善流程或者直接封装原始array
// Comparison of assembly code generated for basic indexing, dereferencing, and increment operations on vectors and arrays/pointers.
// Assembly code was generated by gcc 4.1.0 invoked with g++ -O3 -S on a x86_64-suse-linux machine.
#include
struct S
{
int padding;
std::vector
int * p;
std::vector
};
int pointer_index (S & s) { return s.p[3]; }
// movq 32(%rdi), %rax
// movl 12(%rax), %eax
// ret
int vector_index (S & s) { return s.v[3]; }
// movq 8(%rdi), %rax
// movl 12(%rax), %eax
// ret
// Conclusion: Indexing a vector is the same damn thing as indexing a pointer.
int pointer_deref (S & s) { return *s.p; }
// movq 32(%rdi), %rax
// movl (%rax), %eax
// ret
int iterator_deref (S & s) { return *s.i; }
// movq 40(%rdi), %rax
// movl (%rax), %eax
// ret
// Conclusion: Dereferencing a vector iterator is the same damn thing as dereferencing a pointer.
void pointer_increment (S & s) { ++s.p; }
// addq $4, 32(%rdi)
// ret
void iterator_increment (S & s) { ++s.i; }
// addq $4, 40(%rdi)
// ret
// Conclusion: Incrementing a vector iterator is the same damn thing as incrementing a pointer.
stereoMatching 2012-11-16 打赏举报 回复 我测过g++4.5~4.6和vc2010
效率和原始阵列没什麽差别
有vc测的时候记得要下macro把越位检查关掉
就如swordtan说的
vector的是对数组的封装,通过指针访问数组中的元素
除非编译器的优化做得不好,否则不会有效率上的差别 swordtan 2012-11-16 打赏举报 回复 vector的是对数组的封装,通过指针访问数组中的元素
vector的基本上所有的成员函数都是inline的,
所以,效率上来说,对数组和对vector操作,基本上没什么效率差别 sniffer12345 2012-11-15 打赏举报 回复 引用 11 楼 rocktyt2 的回复:引用 10 楼 sniffer12345 的回复:引用 7 楼 rocktyt2 的回复:引用 5 楼 kissjhy 的回复:再问个问题
用size_type(下标)的方法 是不是比用iterator 慢呢?
[]运算符的方法是最快的,因为没有做任何检查,直接像原生数组一样访问
iterator难道就慢啦?
我用VS2010的测试结果,iterator比[]要……
是啊,测速度得release才有意义。既然release差别这么一点,那么就能直接下论断:iter和[]一样快! rocktyt 2012-11-15 打赏举报 回复 引用 10 楼 sniffer12345 的回复:引用 7 楼 rocktyt2 的回复:引用 5 楼 kissjhy 的回复:再问个问题
用size_type(下标)的方法 是不是比用iterator 慢呢?
[]运算符的方法是最快的,因为没有做任何检查,直接像原生数组一样访问
iterator难道就慢啦?
我用VS2010的测试结果,iterator比[]要慢,debug模式差好几倍,release模式差别很小但是还是要慢上一点点,据说vector的迭代器release模式下是优化成指针的,那样的话和[]的速度应该是基本一样的。
当然不同的编译器或不同的实现会有一些差别,不过我不认为有哪个编译器上会出现iterator反而比[]速度更快的情况出现
实际使用时这点差别完全可以忽略不计,一般情况循环内的操作花的时间比起用iterator还是[]访问来多的多,不需要纠结在这个地方
顺便附上我测试用的代码
int main(int argc, char* argv[])
{
double x=0;
vector
unsigned long time=GetClock();
for (auto i=v.begin(); i!=v.end(); ++i)
x+=log(*i);
cout< size_t size=v.size(); x=0; time=GetClock(); for (size_t i=0; i!=size; ++i) x+=log(v[i]); cout< getchar(); return 0; } sniffer12345 2012-11-15 打赏举报 回复 引用 7 楼 rocktyt2 的回复:引用 5 楼 kissjhy 的回复:再问个问题 用size_type(下标)的方法 是不是比用iterator 慢呢? []运算符的方法是最快的,因为没有做任何检查,直接像原生数组一样访问 iterator难道就慢啦? buyong 2012-11-15 打赏举报 回复 不会慢,为什么回答必须是大于6个字符的字符串 abzhang2 2012-11-15 打赏举报 回复 vector用起来方便, 。数组在操作上, 尤其是添加删除麻烦。 rocktyt 2012-11-15 打赏举报 回复 引用 5 楼 kissjhy 的回复:再问个问题 用size_type(下标)的方法 是不是比用iterator 慢呢? []运算符的方法是最快的,因为没有做任何检查,直接像原生数组一样访问 Emiyasstar__ 2012-11-15 打赏举报 回复 vector里面也是数组,又不是链表,能慢到哪里去 kissjhy 2012-11-15 打赏举报 回复 再问个问题 用size_type(下标)的方法 是不是比用iterator 慢呢? Ahh_Freshmeat 2012-11-15 打赏举报 回复 那怎么才叫会呢? nice_cxf 2012-11-15 打赏举报 回复 很多大概不会,但是稍微慢一点点是肯定的,如果你对速度要求很高,同时又很少的插入删除操作,还是用数组的好 AAA20090987 2012-11-15 打赏举报 回复 如果你不乱用,就慢0.1%,否则,就慢10000%,呵呵 加载更多回复(1) 给C++初学者的忠告 - **解释**:Effective C++、More Effective C++及Exceptional C++等书籍提供了很多实用的编程技巧。 - **建议**:仔细研读这些书籍,并将其中的知识点应用于日常编程实践中。 #### 24. 不要盲目追求速度 - **解释... 关于C++的一些小程序 理解指针的声明、使用及指针运算至关重要。 6. **动态内存分配与释放**:new和delete操作符用于动态地分配和释放内存,这对于管理资源和避免内存泄漏至关重要。 7. **模板**:模板允许我们创建泛型代码,可以应用... 我自己做的c++题目,,c++代码,大一写的,, 在本压缩包中,我们看到的是一个大一学生编写的C++编程练习题目及代码。...对于那些想要提升C++技能或帮助新手的人来说,这是一个很好的资源。无论你是初学者还是有经验的开发者,都可以从中受益,一起探讨编程的魅力。 std::vector介绍 本文介绍了C++标准库中的容器类vector,分析了它的优点,并且建议在应用程序中使用它作为动态数组的优先选择,而不是MFC的CArray 在一些使用 MFC 的程序中,经常看到许多程序使用 CArray的 vector 作为dll 接口参数_DLL中传递STL参数,vector对象作为dll参数传递等问题 STL使用模板生成,当我们使用模板的时候,每一个EXE,和DLL都在编译器产生了自己的代码,导致模板所使用的静态成员不同步,所以出现数据传递的各种问题,下面是详细解释。 原因分析:一句话-----如果任何STL类使用了... C++ 语言 65,194 社区成员 250,524 社区内容 发帖 与我相关 我的任务 C++ 语言 C++ 语言相关问题讨论,技术干货分享,前沿动态等 复制链接 扫一扫 分享 确定 社区描述 C++ 语言相关问题讨论,技术干货分享,前沿动态等 c++ 技术论坛(原bbs) 社区管理员 加入社区 获取链接或二维码 近7日 近30日 至今 加载中 查看更多榜单 社区公告 请不要发布与C++技术无关的贴子请不要发布与技术无关的招聘、广告的帖子请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下 试试用AI创作助手写篇文章吧 + 用AI写文章