实现和使用迭代器是否会引入任何类型的
与直接使用指针相比,性能损失?\
这个问题是有问题的,因为它假设all迭代器是内存中连续数组的迭代器。但迭代器是概括到一个指针。它也可能是链表、哈希图、红黑树等的迭代器。因此,在这种情况下,您无法真正将基于连续数组的迭代器与更复杂的迭代器的性能进行比较类型,如树木。
现在,让我换个方式问这个问题:
对连续数组实现和使用迭代器是否会引入任何类型的
与直接使用指针相比,性能损失?\
好吧,不是真的,编译器几乎剥离了大部分 C++ 类包装器,并将汇编代码优化为使用 C 指针生成的相同程序集。
不相信我?这是生成的汇编代码你的代码,使用 Visual Studio 2015 update 4,x64 编译:
int main() {
00007FF7A1D71000 mov qword ptr [rsp+8],rbx
00007FF7A1D71005 push rdi
00007FF7A1D71006 sub rsp,40h
00007FF7A1D7100A mov rax,qword ptr [__security_cookie (07FF7A1D75000h)]
00007FF7A1D71011 xor rax,rsp
00007FF7A1D71014 mov qword ptr [rsp+38h],rax
00007FF7A1D71019 movdqa xmm0,xmmword ptr [__xmm@000000280000001e000000140000000a (07FF7A1D732C0h)]
00007FF7A1D71021 lea rbx,[numbers]
00007FF7A1D71026 movdqu xmmword ptr [numbers],xmm0
00007FF7A1D7102C mov dword ptr [rsp+30h],32h
00007FF7A1D71034 mov edi,5
00007FF7A1D71039 nop dword ptr [rax]
00007FF7A1D71040 mov edx,dword ptr [rbx]
00007FF7A1D71042 mov rcx,qword ptr [__imp_std::cout (07FF7A1D73080h)]
00007FF7A1D71049 call qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF7A1D73088h)]
00007FF7A1D7104F mov rcx,rax
00007FF7A1D71052 mov dl,20h
00007FF7A1D71054 call std::operator<<<std::char_traits<char> > (07FF7A1D71110h)
00007FF7A1D71059 lea rbx,[rbx+4]
00007FF7A1D7105D sub rdi,1
00007FF7A1D71061 jne main+40h (07FF7A1D71040h)
00007FF7A1D71063 mov rcx,qword ptr [__imp_std::cout (07FF7A1D73080h)]
00007FF7A1D7106A mov dl,0Ah
00007FF7A1D7106C call std::operator<<<std::char_traits<char> > (07FF7A1D71110h)
00007FF7A1D71071 xor eax,eax
}
这是使用c指针的代码:
int main() {
int numbers[] = { 10,20,30,40,50 };
for (MyIterator it = numbers; it != numbers + 5; it++)
std::cout << *it << ' ';
std::cout << '\n';
return 0;
}
int main() {
00007FF6A72E1000 mov qword ptr [rsp+8],rbx
00007FF6A72E1005 push rdi
00007FF6A72E1006 sub rsp,40h
00007FF6A72E100A mov rax,qword ptr [__security_cookie (07FF6A72E5000h)]
00007FF6A72E1011 xor rax,rsp
00007FF6A72E1014 mov qword ptr [rsp+38h],rax
00007FF6A72E1019 movdqa xmm0,xmmword ptr [__xmm@000000280000001e000000140000000a (07FF6A72E32C0h)]
00007FF6A72E1021 lea rbx,[numbers]
00007FF6A72E1026 movdqu xmmword ptr [numbers],xmm0
00007FF6A72E102C mov dword ptr [rsp+30h],32h
00007FF6A72E1034 mov edi,5
00007FF6A72E1039 nop dword ptr [rax]
00007FF6A72E1040 mov edx,dword ptr [rbx]
00007FF6A72E1042 mov rcx,qword ptr [__imp_std::cout (07FF6A72E3080h)]
00007FF6A72E1049 call qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF6A72E3088h)]
00007FF6A72E104F mov rcx,rax
00007FF6A72E1052 mov dl,20h
00007FF6A72E1054 call std::operator<<<std::char_traits<char> > (07FF6A72E1110h)
00007FF6A72E1059 lea rbx,[rbx+4]
00007FF6A72E105D sub rdi,1
00007FF6A72E1061 jne main+40h (07FF6A72E1040h)
00007FF6A72E1063 mov rcx,qword ptr [__imp_std::cout (07FF6A72E3080h)]
00007FF6A72E106A mov dl,0Ah
00007FF6A72E106C call std::operator<<<std::char_traits<char> > (07FF6A72E1110h)
00007FF6A72E1071 xor eax,eax
}
它们是相同的。