最近,我注意到我的程序具有很大的性能下降,因为版本低于5的gcc的标准库实现产生list::size()
了O(n)
。
我正在使用CentOS 7.2,其默认gcc版本为4.8.5。因此,我安装了scl和devtoolset-7,并重建了程序。但是,我发现list::size()
程序中仍然是一个O(n)
方法,即使我显式设置_GLIBCXX_USE_CXX11_ABI
为1。
为什么?这很奇怪。
我有一个非常简单的代码:
#include <string>
#include <iostream>
int main() {
std::string s("abc");
std::cout << s;
}
Run Code Online (Sandbox Code Playgroud)
然后,我编译了它:
g++ -Wall test_string.cpp -o test_string -std=c++17 -O3 -g3 -ggdb3
Run Code Online (Sandbox Code Playgroud)
然后将其反编译,最有趣的部分是:
00000000004009a0 <_ZNSs4_Rep10_M_disposeERKSaIcE.isra.10>:
4009a0: 48 81 ff a0 11 60 00 cmp rdi,0x6011a0
4009a7: 75 01 jne 4009aa <_ZNSs4_Rep10_M_disposeERKSaIcE.isra.10+0xa>
4009a9: c3 ret
4009aa: b8 00 00 00 00 mov eax,0x0
4009af: 48 85 c0 test rax,rax
4009b2: 74 11 je 4009c5 <_ZNSs4_Rep10_M_disposeERKSaIcE.isra.10+0x25>
4009b4: 83 c8 ff or eax,0xffffffff
4009b7: f0 0f c1 47 10 lock xadd …
Run Code Online (Sandbox Code Playgroud)