C++模板类是否重复使用的每种指针类型的代码?

Ant*_*ony 10 c++ templates

根据我的理解,如果你有一个std::vector<int>和一个std::vector<float>,编译器会创建两个类,每个类一个.因此,虽然减少了写入的代码量,但是不会减少可执行文件的大小(如果我错了,请纠正我).

即使类型是指针,是否也是如此?例如,是否会实例化std::vector<SomeClass*>并且std::vector<SomeOtherClass*>必然会导致编译器为两个实例中的每一个生成单独的代码?

ltj*_*jax 6

这是一个依赖于as-if优化的实现,因此是允许的!

实际上,这甚至不需要由编译器完成.标准库可以这样实现.例如,实现可以使用std::is_pointer然后将所有内容推迟到基于单个void*的实现.(这是精简模板的习语).事实上,在库实现它之后,在库侧执行此操作似乎比编译器合并代码更可行,但这也是可能的.

  • +1感谢您提及“精简模板”习惯用法。 (2认同)

Ste*_*sop 5

编译器从程序使用的模板中实例化多个类.但是,生成的可执行代码与程序中存在的类有些不同.

在实践中,大多数操作vector都将被内联.因此,根据从该模板实例化多少个不同的类,可执行文件大小可能不会发生很大变化,因为大部分代码大小是每个函数调用站点而不是每个不同的类.但是,它确实取决于实例化的数量,vector<SomeClass*>并且vector<SomeOtherClass*>是不同的类.

如果您进行了显式实例化vector,那么将为该类生成所有成员函数.如果你寻找它,你可能会看到代码大小的差异.但通常您没有显式实例化模板类,因此只生成您使用的成员函数.

  • 显式实例化是一种语义操作:它导致实例的相应声明和定义存在。它不会强迫函数代码的生成。编译器可以自由地不为未使用的函数生成代码。 (2认同)

Eri*_*hil 5

如果生成的行为正确,则编译器可以生成一组实现模板的两个实例化的代码。对于指针类型和非指针类型都可能发生这种情况。它可以为模板类中的每个例程(又名 \xe2\x80\x9cmethod\xe2\x80\x9d)独立发生。

\n\n

可能很难确定何时会发生这种情况,并且编译器可能会或可能不会识别这样做的机会。

\n\n

例如,如果例程仅复制类(如赋值运算符通常所做的那样),则可以对类数据具有相同大小的模板的任何实例化使用相同的代码。在某些处理器上,添加两个对象的代码可能与添加到对象的int代码相同。unsigned int

\n