[英]Where is code of the instantiation of C++ vector?
我有一个非常简单的代码如下,它使用 C++ 向量:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> g1;
return 0;
}
通过将代码复制到网站https://godbolt.org/ ,我知道生成的汇编代码如下:
main:
stp x29, x30, [sp, -64]!
mov x29, sp
str x19, [sp, 16]
add x0, sp, 40
bl std::vector<int, std::allocator<int> >::vector()** [complete object constructor]
mov w19, 0
add x0, sp, 40
bl std::vector<int, std::allocator<int> >::~vector() [complete object destructor]
mov w0, w19
ldr x19, [sp, 16]
ldp x29, x30, [sp], 64
ret
__static_initialization_and_destruction_0(int, int):
stp x29, x30, [sp, -32]!
mov x29, sp
str w0, [sp, 28]
str w1, [sp, 24]
ldr w0, [sp, 28]
cmp w0, 1
bne .L27
ldr w1, [sp, 24]
mov w0, 65535
cmp w1, w0
bne .L27
adrp x0, _ZStL8__ioinit
add x0, x0, :lo12:_ZStL8__ioinit
bl std::ios_base::Init::Init() [complete object constructor]
adrp x0, __dso_handle
add x2, x0, :lo12:__dso_handle
adrp x0, _ZStL8__ioinit
add x1, x0, :lo12:_ZStL8__ioinit
adrp x0, _ZNSt8ios_base4InitD1Ev
add x0, x0, :lo12:_ZNSt8ios_base4InitD1Ev
bl __cxa_atexit
.L27:
nop
ldp x29, x30, [sp], 32
ret
_GLOBAL__sub_I_main:
stp x29, x30, [sp, -16]!
mov x29, sp
mov w1, 65535
mov w0, 1
bl __static_initialization_and_destruction_0(int, int)
ldp x29, x30, [sp], 16
ret
DW.ref.__gxx_personality_v0:
.xword __gxx_personality_v0
现在我的问题是在哪里可以找到std::vector<int, std::allocator >::vector()的代码。
如果我在我的代码中定义一个新的模板类,如下所示:
#include <iostream>
using namespace std;
template <class T, class U> class A {
T x;
U y;
public:
A() { cout << "Constructor Called" << endl; }
};
int main()
{
A<char, char> a;
A<int, double> b;
return 0;
}
我知道 A<char, char> 和 A<int, double> 的代码是在我自己代码的目标文件中生成的。 但是对于C++ STL的模板类和模板函数,他们实例化对象的代码在哪里呢?
C++ 标准库的库文件中有,例如libstdc++.so ,但我认为编译器不会在该 .so 文件中生成代码。
谢谢!
我知道 A<char, char> 和 A<int, double> 的代码是在我自己代码的目标文件中生成的。 但是对于C++ STL的模板类和模板函数,他们实例化对象的代码在哪里呢?
完全相同:它们是模板类型,只有您的特定实例化才会使std::vector<int, std::allocator >::vector()
存在。
您需要从翻译单元的角度考虑这一点; 因此,将在包含标头并实例化该特定类型的每个翻译单元中找到此机器代码。
您只是感到困惑,因为 godbolt.org 默认情况下在汇编视图中不显示标准库函数。
单击“过滤器...”,然后取消选择“库函数”。
然后你会得到缺失的符号,例如std::vector<int>
默认构造函数和析构函数。
默认情况下不显示它们,因为通常对它们不感兴趣,并且可能有许多库函数使输出混乱。
在某些情况下,标准库使用.so
的显式实例化,而不是使用标准库模板隐式实例化到翻译单元。 如果我没记错的话,Libstdc++ 为std::string
(即std::basic_string<char>
)执行此操作,但我认为没有任何标准库实现为std::vector
执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.