根据我的理解,如果你有一个std::vector<int>和一个std::vector<float>,编译器会创建两个类,每个类一个.因此,虽然减少了写入的代码量,但是不会减少可执行文件的大小(如果我错了,请纠正我).
即使类型是指针,是否也是如此?例如,是否会实例化std::vector<SomeClass*>并且std::vector<SomeOtherClass*>必然会导致编译器为两个实例中的每一个生成单独的代码?
编译器从程序使用的模板中实例化多个类.但是,生成的可执行代码与程序中存在的类有些不同.
在实践中,大多数操作vector都将被内联.因此,根据从该模板实例化多少个不同的类,可执行文件大小可能不会发生很大变化,因为大部分代码大小是每个函数调用站点而不是每个不同的类.但是,它确实取决于实例化的数量,vector<SomeClass*>并且vector<SomeOtherClass*>是不同的类.
如果您进行了显式实例化vector,那么将为该类生成所有成员函数.如果你寻找它,你可能会看到代码大小的差异.但通常您没有显式实例化模板类,因此只生成您使用的成员函数.
如果生成的行为正确,则编译器可以生成一组实现模板的两个实例化的代码。对于指针类型和非指针类型都可能发生这种情况。它可以为模板类中的每个例程(又名 \xe2\x80\x9cmethod\xe2\x80\x9d)独立发生。
\n\n可能很难确定何时会发生这种情况,并且编译器可能会或可能不会识别这样做的机会。
\n\n例如,如果例程仅复制类(如赋值运算符通常所做的那样),则可以对类数据具有相同大小的模板的任何实例化使用相同的代码。在某些处理器上,添加两个对象的代码可能与添加到对象的int代码相同。unsigned int