请教:用vector是不是要比指针慢很多

社区

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 v;

int * p;

std::vector::iterator i;

};

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 v(100000000,2);//release模式多加个0重复多次可以看出iterator还是慢上那么一点点,虽然差别很小

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写文章