替代问题的标题是: 如何明确地让编译器为特定翻译单元中的编译器生成的构造函数生成代码?
我们面临的问题是,对于一个代码路径,如果一个对象的 copy-ctor 调用没有被内联,即如果这个构造函数是手动实现的,那么结果——经过彻底测量——性能会更好(大约 5%) 。(我们注意到这一点是因为在代码清理期间,删除了该类(17 个成员)的多余显式实现的复制 ctor。)
编辑:请注意,我们已经检查了生成的汇编代码,并确保内联和代码生成正在发生,正如我为两个不同的代码版本所描述的那样。
我们现在面临的选择是直接将手动 copy-ctor 代码放回原处(它与编译器生成的代码完全相同)或找到任何其他不内联此类的 copy-ctor 的方法。
是否有任何方法(对于 Microsoft Visual C++)在特定翻译单元中显式实例化编译器生成的类函数,或者它们是否总是内联在使用它们的每个翻译单元中?(也欢迎对 gcc 或其他编译器发表评论,以更好地了解情况。)
由于前 2 个答案显示了一些误解:编译器生成的类函数只有在用户既没有声明也没有定义的情况下才由编译器本身生成。因此,不能对它们应用任何修饰符,因为源代码中不存在这些函数。
struct A {
std::string member;
};
A
有一个默认和复制 ctor、一个 dtor 和一个复制运算符。这些函数都不能通过一些 declspec 修改,因为它们不存在于代码中。
struct B {
std::string member;
B(B const& rhs);
};
B
现在有一个用户提供的副本 ctor 并且用户必须实现它。编译器不会为它生成代码。
怀疑者的更多背景:-) ...
此代码是使用 MS Visual C++ 编译的,但它是为嵌入式(类似)(实时)系统而链接的。性能是通过在这个系统上计时来衡量的,因此我认为计时的人会有一些不错的数字。
通过比较两个代码版本来执行测试,其中唯一的区别是这一类的内联与非内联复制ctor。内联代码的时间差了大约 5%。
进一步检查发现我有一个错误:编译器将为复杂的复制构造函数生成单独的函数。它将自行决定执行此操作,并且还取决于优化设置。所以在我们的例子中,编译器在我们的特定情况下做错了事情。从到目前为止的答案来看,我们似乎无法告诉编译器。:-(